J'ai un fichier qui est constamment écrit/mis à jour. Je veux trouver la dernière ligne contenant un mot particulier, puis imprimer la dernière colonne de cette ligne.
Le fichier ressemble à quelque chose comme ça. Plus de lignes A1/B1/C1 y seront ajoutées au fil du temps.
A1 123 456
B1 234 567
C1 345 678
A1 098 766
B1 987 6545
C1 876 5434
J'ai essayé d'utiliser
tail -f file | grep A1 | awk '{print $NF}'
pour imprimer la valeur 766, mais rien n’est sorti.
Y a-t-il un moyen de faire cela?
Vous ne voyez rien, à cause de la mise en mémoire tampon. La sortie est affichée lorsque le nombre de lignes est suffisant ou que la fin du fichier est atteinte. tail -f
signifie attendre plus d'entrées, mais il n'y a plus de lignes dans file
et le canal vers grep
n'est donc jamais fermé.
Si vous omettez -f
de tail
, le résultat s'affiche immédiatement:
tail file | grep A1 | awk '{print $NF}'
@ EdMorton a raison bien sûr. Awk peut également rechercher A1
, ce qui raccourcit la ligne de commande en
tail file | awk '/A1/ {print $NF}'
ou sans queue, affichant la dernière colonne de toutes les lignes contenant A1
awk '/A1/ {print $NF}' file
Grâce au commentaire de @ MitchellTracy, tail
pourrait manquer l'enregistrement contenant A1
et ainsi vous n'obtiendrez aucune sortie. Cela peut être résolu en basculant tail
et awk
, en effectuant une première recherche dans le fichier, puis en affichant la dernière ligne:
awk '/A1/ {print $NF}' file | tail -n1
Vous pouvez le faire sans awk avec seulement quelques pipes.
tac file | grep -m1 A1 | rev | cut -d' ' -f1 | rev
Pour imprimer la dernière colonne d'une ligne, utilisez simplement $ (NF):
awk '{print $(NF)}'
Une manière en utilisant awk
:
tail -f file.txt | awk '/A1/ { print $NF }'
Vous pouvez tout faire dans awk
:
<file awk '$1 ~ /A1/ {m=$NF} END {print m}'
peut-être que cela fonctionne?
grep A1 file | tail -1 | awk '{print $NF}'
ls -l | awk '{print $9}' | tail -n1
Utiliser 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
$
Exécutez ceci sur le fichier:
awk 'ORS=NR%3?" ":"\n"' filename
et vous obtiendrez ce que vous cherchez.