Drucken der letzten Spalte einer Zeile in einer Datei


135

Ich habe eine Datei, die ständig geschrieben / aktualisiert wird. Ich möchte die letzte Zeile finden, die ein bestimmtes Wort enthält, und dann die letzte Spalte dieser Zeile drucken.

Die Datei sieht ungefähr so ​​aus. Weitere A1 / B1 / C1-Zeilen werden im Laufe der Zeit daran angehängt.

A1 123 456
B1 234 567
C1 345 678
A1 098 766
B1 987 6545
C1 876 5434

Ich habe versucht zu benutzen

tail -f file | grep A1 | awk '{print $NF}'

um den Wert 766 zu drucken, wird aber nichts ausgegeben.

Gibt es eine Möglichkeit, dies zu tun?

Antworten:


199

Wegen der Pufferung sehen Sie nichts. Die Ausgabe wird angezeigt, wenn genügend Zeilen vorhanden sind oder das Dateiende erreicht ist. tail -fbedeutet, auf weitere Eingaben zu warten, aber es sind keine Zeilen mehr vorhanden, filesodass die Leitung zu grepnie geschlossen wird.

Wenn Sie weglassen -fvon taildem Ausgang wird sofort angezeigt:

tail file | grep A1 | awk '{print $NF}'

@ EdMorton ist natürlich richtig. Awk kann auch suchen A1, wodurch die Befehlszeile verkürzt wird

tail file | awk '/A1/ {print $NF}'

oder ohne Schwanz, zeigt die letzte Spalte aller Zeilen mit A1

awk '/A1/ {print $NF}' file

Dank des Kommentars von @ MitchellTracy tailkönnte der Datensatz fehlen A1und Sie erhalten überhaupt keine Ausgabe. Dies kann gelöst werden, indem Sie umschalten tailund awkzuerst die Datei durchsuchen und erst dann die letzte Zeile anzeigen:

awk '/A1/ {print $NF}' file | tail -n1

14
Sie brauchen grep + awk nie, da awk seinen eigenen RE-Vergleich durchführen kann. "grep A1 | awk '{print $ NF}'" sollte nur "awk '/ A1 / {print $ NF}'" sein. Wenn Sie tail -f nicht verwenden, brauchen Sie tail überhaupt nicht. Sie können einfach Folgendes tun: awk '/ A1 / {f = $ NF} END {print f}' Datei
Ed Morton

Dies ist nicht ganz richtig, da die Spalte möglicherweise nicht in dem Fenster angezeigt wird, taildas Ihnen raw bietet. Wenn Sie nicht wissen, dass es mit einer bestimmten Häufigkeit erscheinen wird, wäre es sicherer awk '/A1/ {print $NF}' file | tail -n1.
Mitchell Tracy


12

Ein Weg mit awk:

tail -f file.txt | awk '/A1/ { print $NF }'

Ich dachte, das wäre die richtige Lösung für das gepostete Problem (+1!), Aber jetzt sehe ich, dass ich die Frage nicht verstehe. Das OP möchte das letzte Feld aus der LAST LINE der Datei, aber es gibt keine LAST LINE, wenn Sie tail -f verwenden. Vielleicht meint er die letzte Zeile AKTUELL in der Datei. In diesem Fall siehe einen meiner anderen Kommentare.
Ed Morton

Sehr gut und einfach. Daumen hoch. Daumen runter für awk's kryptische Syntax :)
Stamster

11

Sie können dies ohne awk mit nur einigen Rohren tun.

tac file | grep -m1 A1 | rev | cut -d' ' -f1 | rev

Dies löst Ihr Problem, verwendet aber nicht wirklich awk. Hoffe es ist trotzdem gut genug für dich.
Miono

4

Vielleicht funktioniert das?

grep A1 file | tail -1 | awk '{print $NF}'

2

Sie können alles tun in awk:

<file awk '$1 ~ /A1/ {m=$NF} END {print m}'

1
Sie brauchen split () und ein Array nicht, speichern Sie einfach das letzte Feld und drucken Sie Folgendes aus: awk '/ A1 / {f = $ NF} END {print f}' Datei
Ed Morton

2

Verwenden von Perl

$ cat rayne.txt
A1 123 456
B1 234 567
C1 345 678
A1 098 766
B1 987 6545
C1 876 5434


$ perl -lane ' /A1/ and $x=$F[2] ; END { print "$x" } ' rayne.txt
766

$

Sieht zu kompliziert aus, mach es einfachperl -lane 'print $F[2] if /A1/' rayne.txt
Hi-Angel

1
@ Hi-Angel..die Frage fragt nach dem letzten Auftreten von A1. Ihre Antwort druckt alle Übereinstimmungen aus. Übrigens, wenn Ihnen meine Antwort gefällt, stimmen Sie sie
bitte ab

1

awk -F " " '($1=="A1") {print $NF}' FILE | tail -n 1

Verwendung awkmit Feldtrennzeichen -F auf Leerzeichen "" setzen.

Verwenden Sie das Muster $1=="A1" und die Aktion {print $NF} . Dadurch wird das letzte Feld in jedem Datensatz gedruckt, in dem das erste Feld "A1" ist. Leiten Sie das Ergebnis in den Schwanz und verwenden Sie die -n 1Option, um nur die letzte Zeile anzuzeigen.


0

Führen Sie dies in der Datei aus:

awk 'ORS=NR%3?" ":"\n"' filename

und Sie werden bekommen, wonach Sie suchen.


0

Nicht das eigentliche Problem hier, könnte aber jemandem helfen: Ich habe awk "{print $NF}"die falschen Anführungszeichen notiert. Sollte sein awk '{print $NF}', damit sich die Shell nicht ausdehnt $NF.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.