Programing

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

lottogame 2020. 5. 9. 09:02
반응형

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


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

일반적으로 여기에 많은 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

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

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

다음 행에 'blah'가 포함되어 있지 않으면 다음과 같이 필터링 할 수 있습니다.

grep -A1 blah logfile | grep -v blah

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


펄 원 라이너 경고

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

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

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

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

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


It looks like you're using the wrong tool there. Grep isn't that sophisticated, I think you want to step up to awk as the tool for the job:

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

If you get any problems let me know, I think its well worth learning a bit of awk, its a great tool :)

p.s. This example doesn't win a 'useless use of cat award' ;) http://porkmail.org/era/unix/award.html

참고URL : https://stackoverflow.com/questions/7451423/how-to-show-only-next-line-after-the-matched-one

반응형