@Ed Morton: Burada sana katılmıyorum. Çok sed
satırlı grepleme yapmanın zarif bir yolunu bulmak için çok kullanışlı ve basit buldum (bir kez desen kavramını alıp tamponları tuttuğunuzda).
Örneğin, ana bilgisayar adları ve her ana bilgisayar hakkında bazı bilgiler içeren, aralarında pek umursamadığım pek çok önemsiz metin dosyası alalım.
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
Bana göre, sadece ana bilgisayar adı ve karşılık gelen info
satır ile satırları almak için bir awk betiği sed ile yapabileceğimden biraz daha fazlasını alacaktır:
sed -n '/Host:/{h}; /Info/{x;p;x;p;}' myfile.txt
çıktı şöyle görünür:
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!!
( Host: foo1
Çıktıda iki kez göründüğüne dikkat edin.)
Açıklama:
-n
açıkça yazdırılmadıkça çıktıyı devre dışı bırakır
- ilk eşleşme,
Host:
satırı bulur ve tutma arabelleğine (h) koyar
- ikinci eşleşme, sonraki Bilgi: satırını bulur, ancak ilk önce şablon tamponundaki geçerli satırı (x) tutma arabelleği ile değiştirir ve
Host:
satırı yazdırır (p) , sonra yeniden değiştirir (x) ve Bilgi: satırını yazdırır (p).
Evet, bu basit bir örnek, ancak bunun basit bir sed tek astar tarafından hızla çözülen yaygın bir sorun olduğundan şüpheleniyorum. Belirli, tahmin edilebilir bir sıraya güvenemeyeceğiniz çok daha karmaşık görevler için awk daha uygun olabilir.
echo $'1\n2\n3\n4' | sed -n '1~2h;2~2{p;x;p}'