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 -f
betekent wachten op meer invoer, maar er zijn geen regels meer in file
en dus wordt de pijp naar grep
nooit gesloten.
Als u -f
uit tail
weglaat, wordt de uitvoer onmiddellijk weergegeven:
tail file | grep A1 | awk '{print $NF}'
@EdMorton heeft natuurlijk gelijk. Awkkan zoeken naar A1
als 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, tail
kan het record missen dat A1
bevat en dus krijgt u helemaal geen uitvoer. Dit kan worden opgelost door tail
en awk
te 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 awk
met 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 1
om 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