it-swarm.com.de

Die letzte Spalte einer Zeile in einer Datei drucken

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

Die Datei sieht ungefähr so ​​aus. Im Laufe der Zeit werden weitere A1/B1/C1-Zeilen 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, aber es wird nichts ausgegeben.

Gibt es eine Möglichkeit, dies zu tun?

82
Rayne

Sie sehen nichts wegen Pufferung. Die Ausgabe wird angezeigt, wenn genügend Zeilen vorhanden sind oder das Dateiende erreicht ist. tail -f bedeutet, auf weitere Eingaben zu warten, aber es gibt keine weiteren Zeilen in file, und die Pipe nach grep ist daher nie geschlossen.

Wenn Sie -f in tail nicht angeben, wird die Ausgabe sofort angezeigt:

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

@EdMorton hat natürlich recht. Awk kann auch nach A1 suchen, 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 könnte tail den Datensatz mit A1 verpassen und Sie erhalten somit überhaupt keine Ausgabe. Sie können dieses Problem lösen, indem Sie tail und awk umschalten, zuerst die Datei durchsuchen und erst dann die letzte Zeile anzeigen:

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

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

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

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

awk '{print $(NF)}' 
9

Eine Möglichkeit mit awk:

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

Sie können alles in awk machen:

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

vielleicht funktioniert das?

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

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

Verwenden Sie awk mit dem Feldtrennzeichen - F und setzen Sie ein Leerzeichen "".

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

0
JimBob

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

0
Cristian

Perl verwenden

$ 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

$
0
stack0114106

Führen Sie dies in der Datei aus:

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

und du wirst bekommen, wonach du suchst.

0
Aziz