Bagaimana cara mengambil 2 atau 3 baris, satu berisi teks yang saya inginkan, dan yang lainnya tepat di bawahnya?

32

Ini adalah snapshot dari log kesalahan:

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)

Saya melakukan perintah berikut:

cat foo.log | grep ERROR untuk mendapatkan OP sebagai:

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

Perintah apa yang harus saya jalankan untuk mendapatkan output sebagai

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

yaitu, juga grep garis setelah pola?

theTuxRacer
sumber
Apakah com.rabbitmq.clientteks pada baris berikutnya dimulai dari awal atau ada spasi di depannya?
Eugen Konkov

Jawaban:

62

Lakukan saja:

grep -A1 ERROR

The -A1memberitahu grep untuk memasukkan 1 baris setelah pertandingan. -Btermasuk baris sebelum pertandingan, jika Anda membutuhkannya juga.

Jeremy Kerr
sumber
oh benar, itu akan sangat membantu juga.
theTuxRacer
12
Dan -Ctermasuk baris baik sebelum dan sesudah pertandingan ('C' singkatan dari 'konteks', saya percaya).
Marius Gedminas
5

Untuk cara yang lebih portabel, ada awk

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

Atau mungkin Anda ingin semua lekukan mengikuti?

awk '/^[^[:blank:]]/{p=0} /ERROR/{p=1} p' foo.log
geirha
sumber
2
: O itu informasi yang bagus, tapi agak berlebihan! Meskipun demikian, ada baiknya untuk mengetahui metode yang berbeda :)
theTuxRacer
Saya berharap saya mengerti bagaimana awkperintah - perintah itu bekerja.
Firefeather
3
@Firefeather awk.freeshell.org adalah sumber yang bagus untuk belajar awk. Halaman manual GNU awk juga cukup bagus.
geirha
1

Saya telah menemukan solusi ini:

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

Dimana (\n(?=\s).*?)*artinya:

  • \n temukan baris selanjutnya
  • (?=\s) di mana dimulai dari karakter spasi
  • .*? sampai akhir baris
  • (...)* Temukan garis seperti itu beberapa kali

PS. Anda dapat mengubah pola ini \ncom\.rabbitmq.*?jika baris kedua dimulai dari spasi\s

Eugen Konkov
sumber