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?

Rayne
quelle

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
Olaf Dietsche
quelle
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
27

Um die letzte Spalte einer Zeile zu drucken, verwenden Sie einfach $ (NF):

awk '{print $(NF)}' 
Gennadiy Zolotaryov
quelle
12

Ein Weg mit awk:

tail -f file.txt | awk '/A1/ { print $NF }'
Steve
quelle
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
Miono
quelle
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}'
hgh
quelle
2

Sie können alles tun in awk:

<file awk '$1 ~ /A1/ {m=$NF} END {print m}'
Thor
quelle
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

$
stack0114106
quelle
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.

JimBob
quelle
0

Führen Sie dies in der Datei aus:

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

und Sie werden bekommen, wonach Sie suchen.

Aziz
quelle
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.

delucasvb
quelle
-2

ls -l | awk '{print $9}' | tail -n1

Cristian
quelle
1
Wie hängt das überhaupt mit der Frage des OP zusammen?
Hickory420