@ Ed Morton: non sono d'accordo con te qui. Ho trovato sed
molto utile e semplice (una volta che hai approfondito il concetto del pattern e hai tenuto i buffer) trovare un modo elegante per eseguire il grepping su più righe.
Ad esempio, prendiamo un file di testo che ha nomi host e alcune informazioni su ogni host, con un sacco di spazzatura in mezzo che non mi interessa.
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
Per me, uno script awk per ottenere solo le righe con il nome host e la info
riga corrispondente richiederebbe un po 'più di quello che sono in grado di fare con sed:
sed -n '/Host:/{h}; /Info/{x;p;x;p;}' myfile.txt
l'output è simile 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!!
(Nota che Host: foo1
appare due volte nell'output.)
Spiegazione:
-n
disabilita l'output a meno che non venga stampato esplicitamente
- prima corrispondenza, trova e mette la
Host:
linea in hold buffer (h)
- seconda corrispondenza, trova la riga successiva Info:, ma prima scambia (x) la riga corrente nel pattern buffer con hold buffer, e stampa (p) la
Host:
riga, quindi scambia nuovamente (x) e stampa (p) la riga Info :.
Sì, questo è un esempio semplicistico, ma sospetto che questo sia un problema comune che è stato rapidamente risolto da un semplice sed one-liner. Per compiti molto più complessi, come quelli in cui non puoi fare affidamento su una data sequenza prevedibile, awk potrebbe essere più adatto.
echo $'1\n2\n3\n4' | sed -n '1~2h;2~2{p;x;p}'