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

grep -A1 'blah' logfile

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



답변

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

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


답변

grep을 고수하려는 경우 :

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

또는

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


답변

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

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

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


답변

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

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


답변

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

grep -A1 blah logfile | grep -v blah

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


답변

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

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

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


답변

지금 까지이 질문에 많은 좋은 답변이 주어졌지만을 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