내가 원하는 텍스트를 포함하는 두 줄 또는 세 줄을 grep하는 방법과 그 바로 아래에있는 다른 줄?


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경기 후 1 개 라인을 포함 GREP 알려줍니다. -B당신이 그것을 필요로하는 경우를 대비하여 경기 전에 줄을 포함합니다.


아 맞다, 그것도 도움이 될 것이다.
theTuxRacer

12
그리고 -C경기 전후에 줄을 포함시킵니다 ( 'C'는 '문맥'을 나타냅니다).
Marius Gedminas

5

좀 더 휴대하기 쉬운 방법으로

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

아니면 모든 들여 쓰기 된 줄을 따르기를 원하십니까?

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

2
: O 그것은 좋은 정보이지만 오히려 과잉입니다! 그럼에도 불구하고 다른 방법을 아는 것이 좋습니다 :)
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) 공백 문자로 시작하는 곳
  • .*? 줄의 끝까지
  • (...)* 그런 줄을 여러 번 찾기

추신. \ncom\.rabbitmq.*?공백에서 두 번째 줄이 시작되면 이 패턴을 터프 할 수 있습니다\s

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.