Ed Morton : Je ne suis pas d'accord avec vous. J'ai trouvé sed
très utile et simple (une fois que l'on a compris le concept des tampons pattern et hold) pour trouver une façon élégante de faire du grepping multi-lignes.
Par exemple, prenons un fichier texte contenant des noms d'hôtes et des informations sur chaque hôte, ainsi qu'un tas d'autres informations dont je ne me soucie pas.
Host: foo1
some junk, doesnt matter
some junk, doesnt matter
Info: about foo1 that I really care about!!
some junk, doesnt matter
some junk, doesnt matter
Info: a second line about foo1 that I really care about!!
some junk, doesnt matter
some junk, doesnt matter
Host: foo2
some junk, doesnt matter
Info: about foo2 that I really care about!!
some junk, doesnt matter
some junk, doesnt matter
Pour moi, un awk script pour obtenir juste les lignes avec le nom d'hôte et le correspondant info
Il faudrait un peu plus que ce que je suis capable de faire avec sed :
sed -n '/Host:/{h}; /Info/{x;p;x;p;}' myfile.txt
La sortie ressemble à ça :
Host: foo1
Info: about foo1 that I really care about!!
Host: foo1
Info: a second line about foo1 that I really care about!!
Host: foo2
Info: about foo2 that I really care about!!
(Notez que Host: foo1
apparaît deux fois dans la sortie).
Explication :
-
-n
désactive la sortie sauf si elle est explicitement imprimée
- première correspondance, trouve et place le
Host:
ligne dans le tampon d'attente (h)
- deuxième correspondance, trouve la ligne Info : suivante, mais échange d'abord (x) la ligne courante du tampon de motifs avec le tampon de maintien, et imprime (p) la ligne Info : suivante.
Host:
puis ré-échanger (x) et imprimer (p) la ligne Info :.
Oui, il s'agit d'un exemple simpliste, mais je soupçonne qu'il s'agit d'un problème courant qui a été rapidement résolu par un simple sed one-liner. Pour des tâches beaucoup plus complexes, comme celles pour lesquelles vous ne pouvez pas compter sur une séquence donnée et prévisible, awk peut être mieux adapté.