Як підкреслити 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 щоб отримати ОП як:

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текст у наступному рядку починається з початку, або перед ним є пробіли?
Євген Конков

Відповіді:


62

Просто зробіть:

grep -A1 ERROR

-A1Каже Grep включати 1 рядок після матчу. -Bвключає рядки перед матчем, якщо вам це теж потрібно.


о так, це теж було б корисно.
theTuxRacer

12
І -Cвключає рядки до і після матчу ("Я" означає "контекст", я вважаю).
Маріус Гедмінас

5

Для більш портативного способу є awk

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

Чи, можливо, ви хочете, щоб усі відрезані рядки були наступними?

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

2
: О, це хороша інформація, але швидше завищена! тим не менше, добре знати інший метод :)
TheTuxRacer

Я хотів би, щоб я зрозумів, як працюють ці awkкоманди.
Firefeather

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.