GNU/Linux >> Tutoriels Linux >  >> Linux

Comment obtenir la n-ième ligne après une grep?

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.


Linux
  1. Comment arrêter la commande de recherche après la première correspondance ?

  2. Comment obtenir en toute sécurité la version de Ksh ?

  3. Comment déplacer une ligne vers le haut ou vers le bas d'une ligne dans un fichier texte ?

  4. Renvoyer uniquement la partie d'une ligne après un motif correspondant ?

  5. Comment compter le nombre de lignes dans un fichier après une correspondance Grep ?

Soyez trié avec sort en ligne de commande

Comment obtenir la taille d'un répertoire sous Linux

Comment tirer le meilleur parti de Qmmp 1.0

Comment puis-je obtenir le nombre d'images dans une vidéo sur la ligne de commande Linux ?

Comment obtenir l'URL du fichier Dropbox à partir de la ligne de commande ?

Comment puis-je obtenir mon adresse IP à partir de la ligne de commande ?