@ Ed Morton: Saya tidak setuju dengan Anda di sini. Saya merasa sedsangat berguna dan sederhana (setelah Anda menguasai konsep pola dan menahan buffer) untuk menghasilkan cara yang elegan untuk melakukan multiline grepping.
Sebagai contoh, mari kita ambil file teks yang memiliki nama host dan beberapa informasi tentang setiap host, dengan banyak sampah di antaranya yang tidak saya pedulikan.
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
Bagi saya, skrip awk untuk mendapatkan baris dengan nama host dan infobaris yang sesuai akan memakan waktu lebih banyak daripada yang dapat saya lakukan dengan sed:
sed -n '/Host:/{h}; /Info/{x;p;x;p;}' myfile.txt
keluarannya terlihat seperti:
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!!
(Perhatikan bahwa Host: foo1muncul dua kali di output.)
Penjelasan:
-n menonaktifkan output kecuali dicetak secara eksplisit
- pertandingan pertama, menemukan dan menempatkan
Host:baris ke dalam buffer penahan (h)
- pertandingan kedua, menemukan Info berikutnya: baris, tetapi pertukaran pertama (x) baris saat ini dalam buffer pola dengan buffer penahan, dan mencetak (p)
Host:baris, kemudian menukar kembali (x) dan mencetak (p) baris Info:.
Ya, ini adalah contoh sederhana, tetapi saya menduga ini adalah masalah umum yang dengan cepat ditangani oleh sed sederhana satu baris. Untuk tugas yang jauh lebih kompleks, seperti tugas di mana Anda tidak dapat mengandalkan urutan tertentu yang dapat diprediksi, awk mungkin lebih cocok.
echo $'1\n2\n3\n4' | sed -n '1~2h;2~2{p;x;p}'