@ เอ็ดมอร์ตัน: ฉันไม่เห็นด้วยกับคุณที่นี่ ฉันพบว่าsed
มีประโยชน์และเรียบง่ายมาก (เมื่อคุณรวบรวมแนวคิดของรูปแบบและเก็บบัฟเฟอร์ไว้) เพื่อหาวิธีที่สวยงามในการทำ grepping หลายเส้น
ตัวอย่างเช่นลองใช้ไฟล์ข้อความที่มีชื่อโฮสต์และข้อมูลบางอย่างเกี่ยวกับแต่ละโฮสต์โดยมีขยะจำนวนมากอยู่ระหว่างที่ฉันไม่สนใจ
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
สำหรับฉันสคริปต์ awk เพื่อรับบรรทัดที่มีชื่อโฮสต์และinfo
บรรทัดที่เกี่ยวข้องจะใช้เวลามากกว่าที่ฉันสามารถทำได้ด้วย sed:
sed -n '/Host:/{h}; /Info/{x;p;x;p;}' myfile.txt
ผลลัพธ์ดูเหมือนว่า:
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
จะปรากฏขึ้นสองครั้งในเอาต์พุต)
คำอธิบาย:
-n
ปิดใช้งานเอาต์พุตเว้นแต่จะพิมพ์อย่างชัดเจน
- การแข่งขันครั้งแรกค้นหาและวาง
Host:
บรรทัดไว้ในบัฟเฟอร์ระงับ (h)
- การจับคู่ครั้งที่สองค้นหาข้อมูลถัดไป: บรรทัด แต่บรรทัดปัจจุบันการแลกเปลี่ยน (x) แรกในบัฟเฟอร์รูปแบบที่มีบัฟเฟอร์ค้างและพิมพ์ (p)
Host:
บรรทัดจากนั้นแลกเปลี่ยนใหม่ (x) และพิมพ์ (p) บรรทัดข้อมูล:
ใช่นี่เป็นตัวอย่างที่เรียบง่าย แต่ฉันสงสัยว่านี่เป็นปัญหาทั่วไปที่ได้รับการจัดการอย่างรวดเร็วโดย sed one-liner สำหรับงานที่ซับซ้อนมากขึ้นเช่นงานที่คุณไม่สามารถพึ่งพาลำดับที่กำหนดและคาดเดาได้ awk อาจเหมาะสมกว่า
echo $'1\n2\n3\n4' | sed -n '1~2h;2~2{p;x;p}'