Biri istediğim metni içeren ve diğerlerinin hemen altındaki 2 veya 3 satırı nasıl çizebilirim?


32

Bu bir hata günlüğünün anlık görüntüsüdür:

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)

Aşağıdaki komutu yapıyorum:

cat foo.log | grep ERROR OP’yi aşağıdaki gibi almak için:

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

Çıkışı almak için hangi komutu çalıştırmalıyım?

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

yani, desen (ler) den sonra da çizgileri sürün.


Bir com.rabbitmq.clientsonraki satırdaki metin başlangıçtan mı başlıyor yoksa önünde boşluk var mı?
Eugen Konkov

Yanıtlar:


62

Sadece şunu yap:

grep -A1 ERROR

-A1Maçtan sonra 1 satır içerecek şekilde grep söyler. -BBuna ihtiyaç duymanız durumunda maçtan önceki satırları da içerir.


oh doğru, bu da yardımcı olacaktır.
--TuxRacer

12
Ve -Cmaçtan önce ve sonra satırları içerir ('C' 'bağlam' anlamına gelir, inanıyorum)
Marius Gedminas

5

Daha taşınabilir bir yöntem için, awk var

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

Ya da belki tüm girintili çizgileri takip etmek istersiniz?

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

2
: O, bu iyi bir bilgidir, fakat daha fazla overkill! Bununla birlikte, farklı bir yöntem bilmek iyidir :)
theTuxRacer

Keşke bu awkkomutların nasıl çalıştığını anlamış olsaydım .
Firefeather

3
@Firefeather awk.freeshell.org awk öğrenmek için iyi bir kaynaktır. GNU awk kılavuz sayfası da oldukça iyi.
geirha

1

Bu çözümü buldum:

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

Nerede (\n(?=\s).*?)*demektir:

  • \n sonraki satırı bul
  • (?=\s) boşluk karakterinden başlar
  • .*? çizginin sonuna kadar
  • (...)* Bu tür satırları birden çok kez bulun

PS. \ncom\.rabbitmq.*?İkinci satır boşluktan başlıyorsa, bu deseni toplayabilirsiniz\s

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.