일치하는 줄 다음에 다음 줄만 표시하는 방법?


218
grep -A1 'blah' logfile

'blah'가있는 모든 줄에 대해이 명령 덕분에 'blah'가 포함 된 줄과 로그 파일에서 다음 줄이 출력됩니다. 그것은 간단한 일이 될 수도 있지만 나는 'ㅋ'을 가지고 있으며, 그 라인을 생략 할 수있는 방법 찾을 수없는 경우에만 출력에 다음 줄을 표시합니다.


72
나는 많은 사람들이 찾고 여기에 올 생각 -A1옵션
mirelon

그런 다음 이것을 사용하여 공개 IP를 얻습니다. :)curl whatismyip.org | grep -A1 'Your IP Address'
shrekuu

6
유사하게 -B1, -B2, -B3, -A1, -A2, -A3입니다. . .
meawoppl

5
@shrek curl icanhazip.com (grep 필요 없음) :)
alexyorke

1
귀하의 질문은 내 질문에 대답 ... -A1. 감사!
S3DEV

답변:


181

awk로 시도해 볼 수 있습니다.

awk '/blah/{getline; print}' logfile

3
grep -A2 동등 물 (필요한 것)을 정말로 원하는 사람에게는 getline이 줄을 먹고 다음 줄로 넘어갑니다. 그래서 나를 위해 일한 것은 말 그대로 단지awk '/blah/{getline; getline; print}' logfile
Aaron R.

160

grep을 고수하려는 경우 :

grep -A1 'blah' logfile|grep -v "blah"

또는

sed -n '/blah/{n;p;}' logfile

2
@ 켄트, 팁 주셔서 감사합니다. 그래도 내 POV에서 grep은 sed 또는 best answer로 표시되는 awk 답변과 비교하여 훨씬 더 읽기 쉽고 이해하기 쉽습니다. ...하지만 그것은 아마도
나일

2
-v의 기능에 대해 궁금한 분들은 : -v --invert-match 일치하는 의미를 바꾸어 일치하지 않는 행을 선택하십시오. (-v는 POSIX에 의해 지정됩니다.)
Sammi

2
이 답변이 정말 마음에 들지만 "blah"를 포함하는 행에 두 줄이 있고 두 번째 줄을 얻으려면 작동하지 않습니다 ( "일치 한 줄 다음 줄"). 내 머리 꼭대기에서 유스 케이스를 생각할 수는 없지만 주목할 가치가 있습니다.
Tin Wizard

최고의 솔루션은 "확인"입니다. 두 번째 줄에도 "blah"가 있으면 손에 엉망이됩니다.
riwalk

32

파이핑은 당신의 친구입니다 ...

사용 grep -A1경기 후 다음 줄을 표시하려면 다음 파이프 결과에 tail만 1 개 라인을 잡아,

cat logs/info.log | grep "term" -A1 | tail -n 1

1
"term"이 마지막 행에 있으면, "term"을 포함하는 행을 원하는 것 대신 반환합니다.
Onnonymous

tail -n 1은 전체 파일의 마지막 행만 나타납니다
Sebastian

13

raim의 큰 대답은 나에게 매우 유용했습니다. 패턴 다음에 7 행을 인쇄하기 위해 이것을 확장하는 것은 사소한 일입니다

awk -v lines=7 '/blah/ {for(i=lines;i;--i)getline; print $0 }' logfile

9

다음 줄에 'blah'가 포함되어 있지 않으면 다음을 사용하여 필터링 할 수 있습니다.

grep -A1 blah logfile | grep -v blah

사용할 cat logfile | ...필요가 없습니다.


5

일반적으로 여기에 많은 grep을 요구하고 있으며 다른 도구가 더 나은 솔루션 일 수 있음에 동의합니다. 그러나 임베디드 환경에서 나는 이것을하고 싶 sed거나 하지 않을 수 있습니다 awk. 다음 솔루션이 작동한다는 것을 알았습니다 (연속적으로 일치하지 않는 한).

grep -A1 AT\+CSQ wvdial.out | grep -v AT\+CSQ

기본적으로 각 일치 항목에 대해 한 줄의 컨텍스트를 추가하여 일치시킨 다음 원래 패턴의 역 일치 항목을 통해 파이프를 제거하십시오. 이것은 물론 패턴이 "다음"줄에 나타나지 않는다고 가정 할 수 있음을 의미합니다.


5

지금 까지이 질문에 많은 좋은 답변이 주어졌지만을 awk사용하지 않는 사람은 여전히 ​​그리워 getline합니다. , 때문에 일반적으로 , 그것은 사용할 필요가 없습니다 getline, 나는 갈 것이다 :

awk ' f && NR==f+1; /blah/ {f=NR}' file  #all matches after "blah"

또는

awk '/blah/ {f=NR} f && NR==f+1' file   #matches after "blah" not being also "blah"

논리는 항상 "blah"가있는 행을 저장 한 다음 한 행 뒤에있는 행을 인쇄하는 것으로 구성됩니다.

테스트

샘플 파일 :

$ cat a
0
blah1
1
2
3
blah2
4
5
6
blah3
blah4
7

"blah"다음에 모든 줄을 가져옵니다. 첫 번째 뒤에 나타난 경우 다른 "blah"를 인쇄합니다.

$ awk 'f&&NR==f+1; /blah/ {f=NR}' a
1
4
blah4
7

"blah"자체를 포함하지 않으면 "blah"뒤에 모든 줄을 가져옵니다.

$ awk '/blah/ {f=NR} f && NR==f+1' a
1
4
7

5

grep 으로이 작업을 수행하는 방법을 모르지만 awk를 사용하여 동일한 결과를 얻을 수 있습니다.

awk '/blah/ {getline;print}' < logfile

@jww 차이가 없습니다. 몇 분 떨어져있는 타임 스탬프에서 볼 수 있듯이 거의 같은 시간에 대답 한 것으로 보입니다.
raimue

4

펄 원 라이너 경고

그냥 재미를 위해 ... 경기 후 한 줄만 인쇄

perl -lne '$next=($.+1)if/match/;$.==$next&&print' data.txt

더 재미 ... 경기 후 다음 10 줄을 인쇄하십시오.

perl -lne 'push@nexts,(($.+1)..($.+10))if/match/;$.~~@nexts&&print' data.txt

실제로 두 가지 명령이 있기 때문에 속임수


$. == $ next를 설명 할 수 있습니까? 분명히 그것은 현재 행 번호와 $ next의 숫자 비교 이상이지만 그것이 어떻게 / 왜 작동하는지 이해하지 못합니다.
Keith Bentrup

그 이상은 아닙니다. $. == $next && print과 동일print if $. == $next
beasy

아, 지금 봅니다. 고마워! 두 부분 중 각각은 사실이며 루프의 인접한 인접 반복에서 실행됩니다. 포인트가 당신이 순서를 바꾸고 싶을 때 일치하는 줄을 인쇄한다면 (더처럼 행동 할 것입니다 grep -A1) 가정합니다. 다음 줄만 인쇄하고 일치하는 줄은 인쇄하지 않으려면이 순서대로 유지하십시오. (연속 경기에서 $ next가 어떻게
클로버 될지 주목하십시오

3

거기에 잘못된 도구를 사용하고있는 것 같습니다. Grep은 그렇게 정교하지는 않습니다. 작업 도구로 awk로 올라가고 싶다고 생각합니다.

awk '/blah/ { getline; print $0 }' logfile

당신이 어떤 문제를 알게되면, 나는 그것의 훌륭한 도구를 배울 가치가 있다고 생각합니다. :)

추신 :이 예는 '무용 한 고양이 상을 수상'하지 않습니다;) http://porkmail.org/era/unix/award.html


3
BTW, 인쇄에서 "$ 0"을 건너 뛸 수 있습니다.
Michał Šrajer

0

grep / Pattern / | 꼬리 -n 2 | 머리 -n 1

처음 2를 맞추고 마지막 1을 맞추면 경기 후 첫 번째 줄을 얻습니다.

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