web-dev-qa-db-fra.com

Imprimer la dernière colonne d'une ligne dans un fichier

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?

82
Rayne

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
133
Olaf Dietsche

Vous pouvez le faire sans awk avec seulement quelques pipes.

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

Pour imprimer la dernière colonne d'une ligne, utilisez simplement $ (NF): 

awk '{print $(NF)}' 
9

Une manière en utilisant awk:

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

Vous pouvez tout faire dans awk:

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

peut-être que cela fonctionne?

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

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

0
Cristian

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

$
0
stack0114106

Exécutez ceci sur le fichier:

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

et vous obtiendrez ce que vous cherchez.

0
Aziz