Il n'y a rien de mal avec les deux réponses précédentes, mais j'ai pensé vous faire savoir que trouver la troisième ligne après un motif peut être fait en un seul sed
appeler :
sed -n "/four/ { n; n; p }" SourceData.txt
Parce qu'un seul programme fait le travail, c'est plus efficace que d'exécuter plusieurs filtres. La commande ci-dessus affiche la troisième ligne après chaque instance de "four", sauf si cela se produit à nouveau dans l'une des deux lignes après une correspondance (les autres solutions ne gèrent pas non plus ce cas de la manière attendue); de plus, aucune sortie n'est générée si le motif se trouve dans la dernière ou l'avant-dernière ligne du fichier, ce qui peut ou non être ce que vous voulez.
Pour correspondre à la première instance uniquement :
sed -n "/four/ { n; n; p; q }" SourceData.txt
(Notez que cette réponse est aussi efficace que possible, en mettant fin à l'analyse dès que la correspondance est trouvée.)
J'ajoute cette solution car cela vaut la peine de connaître sed
et, malgré sa syntaxe plutôt rebutante (les expressions régulières sont déjà assez mauvaises !), il peut souvent être extrêmement utile. Ce tutoriel est une bonne introduction.
Cette solution imprime la ligne actuelle ssi il y avait une correspondance il y a deux lignes. C'est légèrement différent de quelques autres réponses car il ne manquera pas un autre match même s'il se produit peu de temps après le match précédent.
awk -v delay=2 '{for (i=delay; i>=0; i--) t[i]=t[i-1]} /four/ {t[0]="m"} {if (t[delay]) print}'
Chaque fois qu'il y a une correspondance, les informations sont stockées dans t[0]
. A chaque ligne le t
tableau est décalé (y compris le décalage t[-1]
à t[0]
pour réinitialiser la valeur de t[0]
). La ligne est imprimée si le tableau indique qu'il y avait une correspondance il y a deux lignes.
Vous pouvez facilement définir un délai différent (par exemple, delay=7
) ou utilisez un autre modèle (par exemple /sda[[:digit:]]/
)
Vous pouvez utiliser cette expression (input.txt
):
grep "four" -A 2 input.txt | tail -n 1
La sortie est :
six 6
Le grep
l'option "-A 2" indique que deux lignes après la ligne correspondante sont sorties.
Et le tail
l'option "-n 1" indique que seul le dernier 1
lignes de ce résultat sont renvoyées.