Как grep 2 или 3 строки, один из которых содержит текст, который я хочу, а остальные - под ним?

Это моментальный снимок журнала ошибок:

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

, т. е. также grep строка (строки) после шаблона?

28
задан 24 February 2011 в 10:02

27 ответов

Просто выполните a:

grep -A1 ERROR

-A1 сообщает grep включить 1 строку после матча. -B включает строки перед матчем, если вам это тоже нужно.

48
ответ дан 25 May 2018 в 22:50
  • 1
    хорошо, это тоже было бы полезно. – theTuxRacer 24 February 2011 в 10:34
  • 2
    И -C включает строки как до, так и после матча («C» означает «контекст», я считаю). – Marius Gedminas 24 February 2011 в 20:01

Просто выполните a:

grep -A1 ERROR

-A1 сообщает grep включить 1 строку после матча. -B включает строки перед матчем, если вам это тоже нужно.

48
ответ дан 25 July 2018 в 22:26

Просто выполните a:

grep -A1 ERROR

-A1 сообщает grep включить 1 строку после матча. -B включает строки перед матчем, если вам это тоже нужно.

48
ответ дан 31 July 2018 в 11:35

Просто выполните a:

grep -A1 ERROR

-A1 сообщает grep включить 1 строку после матча. -B включает строки перед матчем, если вам это тоже нужно.

48
ответ дан 2 August 2018 в 03:53

Просто выполните:

  grep -A1 ERROR  

-A1 сообщает grep включить 1 строку после совпадение. -B включает строки перед совпадением, если вам это тоже нужно.

48
ответ дан 4 August 2018 в 19:56

Просто выполните:

  grep -A1 ERROR  

-A1 сообщает grep включить 1 строку после совпадение. -B включает строки перед совпадением, если вам это тоже нужно.

48
ответ дан 6 August 2018 в 03:59

Просто выполните:

  grep -A1 ERROR  

-A1 сообщает grep включить 1 строку после совпадение. -B включает строки перед совпадением, если вам это тоже нужно.

48
ответ дан 7 August 2018 в 21:57

Просто выполните:

  grep -A1 ERROR  

-A1 сообщает grep включить 1 строку после совпадение. -B включает строки перед совпадением, если вам это тоже нужно.

48
ответ дан 10 August 2018 в 10:11

Просто выполните:

  grep -A1 ERROR  

-A1 сообщает grep включить 1 строку после совпадение. -B включает строки перед совпадением, если вам это тоже нужно.

48
ответ дан 13 August 2018 в 16:33
  • 1
    хорошо, это тоже было бы полезно. – theTuxRacer 24 February 2011 в 10:34
  • 2
    И -C включает строки как до, так и после матча («C» означает «контекст», я считаю). – Marius Gedminas 24 February 2011 в 20:01

Для более портативного способа есть awk

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

Или, может быть, вы хотите, чтобы все отступы были следующими?

awk '/^[^[:blank:]]/{p=0} /ERROR/{p=1} p' foo.log
5
ответ дан 25 May 2018 в 22:50
  • 1
    : О, это хорошая информация, а скорее избыток! тем не менее, полезно знать другой метод :) – theTuxRacer 25 February 2011 в 08:55
  • 2
    Хотелось бы, чтобы я понял, как работают эти команды awk. – Firefeather 5 March 2011 в 00:49
  • 3
    @Firefeather awk.freeshell.org - хороший ресурс для изучения awk. Также очень удобна страница руководства GNU awk. – geirha 5 March 2011 в 16:28

Я нашел это решение:

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

Где (\n(?=\s).*?)* означает:

\n найти следующую строку (?=\s), где начинается с символа пробела .*? до конца строки (...)* Найти такие строки несколько раз

PS. Вы можете опрокинуть этот шаблон \ncom\.rabbitmq.*?, если вторая строка начинается с пробела \s

1
ответ дан 25 May 2018 в 22:50

Я нашел это решение:

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

Где (\n(?=\s).*?)* означает:

\n найти следующую строку (?=\s), где начинается с символа пробела .*? до конца строки (...)* Найти такие строки несколько раз

PS. Вы можете опрокинуть этот шаблон \ncom\.rabbitmq.*?, если вторая строка начинается с пробела \s

1
ответ дан 25 July 2018 в 22:26

Для более портативного способа есть awk

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

Или, может быть, вы хотите, чтобы все отступы были следующими?

awk '/^[^[:blank:]]/{p=0} /ERROR/{p=1} p' foo.log
5
ответ дан 25 July 2018 в 22:26
  • 1
    : О, это хорошая информация, а скорее избыток! тем не менее, полезно знать другой метод :) – theTuxRacer 25 February 2011 в 08:55
  • 2
    Хотелось бы, чтобы я понял, как работают эти команды awk. – Firefeather 5 March 2011 в 00:49
  • 3
    @Firefeather awk.freeshell.org - хороший ресурс для изучения awk. Также очень удобна страница руководства GNU awk. – geirha 5 March 2011 в 16:28

Я нашел это решение:

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

Где (\n(?=\s).*?)* означает:

\n найти следующую строку (?=\s), где начинается с символа пробела .*? до конца строки (...)* Найти такие строки несколько раз

PS. Вы можете опрокинуть этот шаблон \ncom\.rabbitmq.*?, если вторая строка начинается с пробела \s

1
ответ дан 31 July 2018 в 11:35

Для более портативного способа есть awk

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

Или, может быть, вы хотите, чтобы все отступы были следующими?

awk '/^[^[:blank:]]/{p=0} /ERROR/{p=1} p' foo.log
5
ответ дан 31 July 2018 в 11:35
  • 1
    : О, это хорошая информация, а скорее избыток! тем не менее, полезно знать другой метод :) – theTuxRacer 25 February 2011 в 08:55
  • 2
    Хотелось бы, чтобы я понял, как работают эти команды awk. – Firefeather 5 March 2011 в 00:49
  • 3
    @Firefeather awk.freeshell.org - хороший ресурс для изучения awk. Также очень удобна страница руководства GNU awk. – geirha 5 March 2011 в 16:28

Я нашел это решение:

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

Где (\n(?=\s).*?)* означает:

\n найти следующую строку (?=\s), где начинается с символа пробела .*? до конца строки (...)* Найти такие строки несколько раз

PS. Вы можете опрокинуть этот шаблон \ncom\.rabbitmq.*?, если вторая строка начинается с пробела \s

1
ответ дан 2 August 2018 в 03:53

Для более портативного способа есть awk

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

Или, может быть, вы хотите, чтобы все отступы были следующими?

awk '/^[^[:blank:]]/{p=0} /ERROR/{p=1} p' foo.log
5
ответ дан 2 August 2018 в 03:53
  • 1
    : О, это хорошая информация, а скорее избыток! тем не менее, полезно знать другой метод :) – theTuxRacer 25 February 2011 в 08:55
  • 2
    Хотелось бы, чтобы я понял, как работают эти команды awk. – Firefeather 5 March 2011 в 00:49
  • 3
    @Firefeather awk.freeshell.org - хороший ресурс для изучения awk. Также очень удобна страница руководства GNU awk. – geirha 5 March 2011 в 16:28

Для более портативного способа есть awk

  awk '/ ERROR / {n = NR + 1} n & gt; = NR' foo.log  

Или, может быть, вам нужны следующие строки с отступом?

  awk '/ ^ [^ [: blank:]] / {p = 0} / ERROR / {p = 1} p'  foo.log  
5
ответ дан 4 August 2018 в 19:56

Я нашел это решение:

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

Где (\n (? = \ S). *?) * означает:

  • \n найти следующую строку
  • (? = \ s) , где начинается с символа пробела
  • . *? до конца строки
  • (...) * Найти такие строки несколько раз

PS. Вы можете опрокинуть этот шаблон \ncom \ .rabbitmq. *? , если вторая строка начинается с пробела \ s

1
ответ дан 4 August 2018 в 19:56

Для более портативного способа есть awk

  awk '/ ERROR / {n = NR + 1} n & gt; = NR' foo.log  

Или, может быть, вам нужны следующие строки с отступом?

  awk '/ ^ [^ [: blank:]] / {p = 0} / ERROR / {p = 1} p'  foo.log  
5
ответ дан 6 August 2018 в 03:59

Я нашел это решение:

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

Где (\n (? = \ S). *?) * означает:

  • \n найти следующую строку
  • (? = \ s) , где начинается с символа пробела
  • . *? до конца строки
  • (...) * Найти такие строки несколько раз

PS. Вы можете опрокинуть этот шаблон \ncom \ .rabbitmq. *? , если вторая строка начинается с пробела \ s

1
ответ дан 6 August 2018 в 03:59

Для более портативного способа есть awk

  awk '/ ERROR / {n = NR + 1} n & gt; = NR' foo.log  

Или, может быть, вам нужны следующие строки с отступом?

  awk '/ ^ [^ [: blank:]] / {p = 0} / ERROR / {p = 1} p'  foo.log  
5
ответ дан 7 August 2018 в 21:57

Я нашел это решение:

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

Где (\n (? = \ S). *?) * означает:

  • \n найти следующую строку
  • (? = \ s) , где начинается с символа пробела
  • . *? до конца строки
  • (...) * Найти такие строки несколько раз

PS. Вы можете опрокинуть этот шаблон \ncom \ .rabbitmq. *? , если вторая строка начинается с пробела \ s

1
ответ дан 7 August 2018 в 21:57

Для более портативного способа есть awk

  awk '/ ERROR / {n = NR + 1} n & gt; = NR' foo.log  

Или, может быть, вам нужны следующие строки с отступом?

  awk '/ ^ [^ [: blank:]] / {p = 0} / ERROR / {p = 1} p'  foo.log  
5
ответ дан 10 August 2018 в 10:11

Я нашел это решение:

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

Где (\n (? = \ S). *?) * означает:

  • \n найти следующую строку
  • (? = \ s) , где начинается с символа пробела
  • . *? до конца строки
  • (...) * Найти такие строки несколько раз

PS. Вы можете опрокинуть этот шаблон \ncom \ .rabbitmq. *? , если вторая строка начинается с пробела \ s

1
ответ дан 10 August 2018 в 10:11

Для более портативного способа есть awk

  awk '/ ERROR / {n = NR + 1} n & gt; = NR' foo.log  

Или, может быть, вам нужны следующие строки с отступом?

  awk '/ ^ [^ [: blank:]] / {p = 0} / ERROR / {p = 1} p'  foo.log  
5
ответ дан 13 August 2018 в 16:33
  • 1
    : О, это хорошая информация, а скорее избыток! тем не менее, полезно знать другой метод :) – theTuxRacer 25 February 2011 в 08:55
  • 2
    Хотелось бы, чтобы я понял, как работают эти команды awk . – Firefeather 5 March 2011 в 00:49
  • 3
    @Firefeather awk.freeshell.org - хороший ресурс для изучения awk. Также очень удобна страница руководства GNU awk. – geirha 5 March 2011 в 16:28

Я нашел это решение:

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

Где (\n (? = \ S). *?) * означает:

  • \n найти следующую строку
  • (? = \ s) , где начинается с символа пробела
  • . *? до конца строки
  • (...) * Найти такие строки несколько раз

PS. Вы можете опрокинуть этот шаблон \ncom \ .rabbitmq. *? , если вторая строка начинается с пробела \ s

1
ответ дан 13 August 2018 в 16:33

Другие вопросы по тегам:

Похожие вопросы: