วิธี grep 2 หรือ 3 บรรทัดหนึ่งมีข้อความที่ฉันต้องการและอื่น ๆ ด้านล่างหรือไม่


32

นี่เป็นภาพรวมของบันทึกข้อผิดพลาด:

06:16:29,933 ERROR EmailRMManager$:45 - Exception In get Message
com.rabbitmq.client.AlreadyClosedException: clean connection shutdown; reason: Attempt to use closed channel
    at com.rabbitmq.client.impl.AMQChannel.ensureIsOpen(AMQChannel.java:195)
    at com.rabbitmq.client.impl.AMQChannel.rpc(AMQChannel.java:222)
    at com.rabbitmq.client.impl.AMQChannel.rpc(AMQChannel.java:208)
    at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:139)
    at com.rabbitmq.client.impl.ChannelN.basicGet(ChannelN.java:645)

ฉันทำคำสั่งต่อไปนี้:

cat foo.log | grep ERROR เพื่อรับ OP เป็น:

06:16:29,933 ERROR EmailRMManager$:45 - Exception In get Message

ฉันควรใช้คำสั่งอะไรเพื่อให้ได้ผลลัพธ์เป็น

06:16:29,933 ERROR EmailRMManager$:45 - Exception In get Message
    com.rabbitmq.client.AlreadyClosedException: clean connection shutdown; reason: Attempt to use closed channel

นั่นคือยังรวมบรรทัดหลังจากรูปแบบหรือไม่


คือcom.rabbitmq.clientข้อความในบรรทัดถัดไปเริ่มต้นจาก begginning หรือมีพื้นที่บางส่วนในด้านหน้าของมันได้หรือไม่
Eugen Konkov

คำตอบ:


62

เพียงทำ:

grep -A1 ERROR

-A1บอก grep จะรวมสาย 1 หลังการแข่งขัน -Bรวมถึงสายก่อนการแข่งขันในกรณีที่คุณต้องการเช่นกัน


โอ้ใช่แล้วนั่นก็จะเป็นประโยชน์เช่นกัน
theTuxRacer

12
และ-Cรวมถึงบรรทัดทั้งก่อนและหลังการแข่งขัน ('C' หมายถึง 'บริบท' ฉันเชื่อว่า)
Marius Gedminas

5

สำหรับวิธีการพกพาที่มากขึ้นนั่นคือ awk

awk '/ERROR/{n=NR+1} n>=NR' foo.log

หรือบางทีคุณต้องการให้ทุกบรรทัดเยื้องต่อไปนี้?

awk '/^[^[:blank:]]/{p=0} /ERROR/{p=1} p' foo.log

2
: O เป็นข้อมูลที่ดี แต่ค่อนข้างมากเกินไป! กระนั้นที่ดีที่จะรู้วิธีที่แตกต่าง :)
theTuxRacer

ฉันหวังว่าฉันเข้าใจว่าawkคำสั่งเหล่านั้นทำงานอย่างไร
ผจญเพลิง

3
@Firefeather awk.freeshell.orgเป็นแหล่งข้อมูลที่ดีสำหรับการเรียนรู้ awk หน้าคู่มือของ GNU awk นั้นค่อนข้างดีเช่นกัน
geirha

1

ฉันได้พบวิธีแก้ปัญหานี้:

cat apache.error.log | grep -Pzo '^.*?Exception In get Message.*?\ncom\.rabbitmq.*?(\n(?=\s).*?)*$'

ที่(\n(?=\s).*?)*หมายถึง:

  • \n ค้นหาบรรทัดถัดไป
  • (?=\s) ที่เริ่มต้นจากตัวละครช่องว่าง
  • .*? จนกระทั่งสิ้นสุดบรรทัด
  • (...)* ค้นหาบรรทัดดังกล่าวหลายครั้ง

PS คุณอาจสนามหญ้ารูปแบบนี้\ncom\.rabbitmq.*?ถ้าบรรทัดที่สองเริ่มต้นจากช่องว่าง\s

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.