De laatste kolom van een regel in een bestand afdrukken

Ik heb een bestand dat voortdurend wordt geschreven naar/geüpdatet. Ik wil de laatste regel vinden die een bepaald woord bevat en druk dan de laatste kolom van die regel af.

Het bestand ziet er ongeveer zo uit. In de loop van de tijd zullen er meer A1/B1/C1-regels aan worden toegevoegd.

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

Ik heb geprobeerd te gebruiken

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

om de waarde 766 af te drukken, maar er wordt niets uitgevoerd.

Is er een manier om dit te doen?


Antwoord 1, autoriteit 100%

Je ziet niets vanwege buffering. De uitvoer wordt getoond, wanneer er voldoende regels zijn of het einde van het bestand is bereikt. tail -fbetekent wachten op meer invoer, maar er zijn geen regels meer in fileen dus wordt de pijp naar grepnooit gesloten.

Als u -fuit tailweglaat, wordt de uitvoer onmiddellijk weergegeven:

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

@EdMorton heeft natuurlijk gelijk. Awkkan zoeken naar A1als nou ja, wat de opdrachtregel verkort tot

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

of zonder staart, met de laatste kolom van alle regels met A1

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

Dankzij de opmerking van @MitchellTracy, tailkan het record missen dat A1bevat en dus krijgt u helemaal geen uitvoer. Dit kan worden opgelost door tailen awkte wisselen, eerst door het bestand te zoeken en pas dan de laatste regel te tonen:

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

2, Autoriteit 15%

Om de laatste kolom van een lijn af te drukken, gebruik dan $ (NF):

awk '{print $(NF)}' 

3, Autoriteit 5%

een manier met awk:

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

4, Autoriteit 5%

U kunt dit zonder awk doen met slechts enkele pijpen.

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

5, Autoriteit 2%

Misschien werkt dit?

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

6

U kunt alles doen in awk:

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

7

PerL

gebruiken

$ 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
$

8

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

Gebruik awkmet veldscheider -f ingesteld op een spatie “”.

Gebruik het -patroon $1=="A1"EN ACTIE {print $NF}, dit zal Print het laatste veld in elk record waarbij het eerste veld “A1” is. Pijp het resultaat in de staart en gebruik de optie -n 1om alleen de laatste regel weer te geven.


9

Voer dit uit in het bestand:

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

en u krijgt waarnaar u op zoek bent.


Antwoord 10

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

Other episodes