각 grep 결과 다음에 2-4행을 표시하는 방법은 무엇입니까?

각 grep 결과 다음에 2-4행을 표시하는 방법은 무엇입니까?

성공적으로 전송되지 않은 이메일에 대한 이메일 서버 보고서를 저장하는 사서함 파일을 구문 분석하고 있습니다. 잘못된 이메일 주소를 추출하여 시스템에서 제거하고 싶습니다. 로그 파일은 다음과 같습니다.

...some content...
                   The mail system

<[email protected]>: host mx1.hotmail.com[65.54.188.94] said: 550
    Requested action not taken: mailbox unavailable (in reply to RCPT TO
    command)

...some content...
                   The mail system

<[email protected]>: host viking.optimumpro.net[79.101.51.82] said: 550
    Unknown user (in reply to RCPT TO command)

...some content...
                   The mail system

<[email protected]>: host mta5.am0.yahoodns.net[74.6.140.64] said: 554
    delivery error: dd This user doesn't have a yahoo.com account
    ([email protected]) [0] - mta1172.mail.sk1.yahoo.com (in reply to end
    of DATA command)

...etc.

이메일 주소는 "Mail System" 줄 다음 두 줄입니다. 이와 같이 grep을 사용하면 "메일 시스템" 줄과 다음 두 줄이 제공됩니다.

grep -A 2 "The mail system" mbox_file

그러나 이 출력에서 ​​"메일 시스템" 줄과 두 번째 빈 줄을 제거하는 방법을 모르겠습니다. 이 작업을 수행하기 위해 PHP/Perl/Python 스크립트를 작성할 수 있다고 생각하지만 grep이나 다른 표준 도구를 사용하여 이 작업을 수행할 수 있는지 알고 싶습니다. -B 매개변수에 음수 오프셋을 부여해 보았습니다.

grep -A 2 -B -2 "The mail system" mbox_file

그러나 grep은 다음과 같이 불평합니다.

grep: -2: invalid context length argument

grep을 사용하여 이를 수행할 수 있는 방법이 있습니까?

답변1

이 문제를 해결하는 가장 쉬운 방법은 끝에 다른 파이프를 붓는 것 grep입니다 . grep예를 들어:

grep -A 4 "The mail system" temp.txt | grep -v "The mail system" | grep -v '^\d*$'

답변2

잠겨있지 않다면 grep시도해 보세요 sed...

sed -n '/The mail system/{n;n;p}' 

"mail system"이 포함된 줄을 찾으면 다음 줄을 두 번 통과하고 n;n;이전 줄을 각각 삭제합니다.
이렇게 하면 패턴 공간에 그룹의 세 번째 줄이 남고 psed print 명령을 통해 인쇄됩니다. 선행 -n옵션은 다른 모든 인쇄를 차단합니다.

다음 두 줄을 인쇄하려면 이는 단지 예일 뿐입니다.다음 단계 및 인쇄 n;p두 번 더.

sed -n '/The mail system/{n; n;p; n;p; n;p}'   

필요한 라인의 다음 라인 읽기는 누적되어 단 한 번의 블록으로 인쇄될 수 있습니다 p. N다음 라인을 읽고 패턴 공간에 추가합니다.

최종 제거 버전은 다음과 같습니다.

sed -n '/The mail system/{n;n;N;N;p}'   

당신이 하나를 원한다면그룹 구분 기호, grep 출력과 유사하게 sed를 사용할 수 있습니다끼워 넣다명령 i(한 줄의 마지막 명령이어야 함)...

다음은 다음을 포함하는 구문입니다.그룹 구분 기호

sed -n '/The mail system/{n;n;N;N;p;i--
       }' > output-file  # or | ...

첫 번째 게임의 결과는 다음과 같습니다.

<[email protected]>: host mx1.hotmail.com[65.54.188.94] said: 550
    Requested action not taken: mailbox unavailable (in reply to RCPT TO
    command)                                                                    
--

답변3

grep -A 2 -B -2 "The mail system" mbox_file

-B이전 행에 사용되므로 음수 값을 제공할 필요가 없습니다.

grep -A 2 -B 2 "The mail system" mbox_file   # This will work please check

답변4

처음 두 행을 제거하려면 다음으로 파이프하십시오.sed

sed '1,2d'

좋다

grep -A 2 "The mail system" mbox_file | sed '1,2d'

관련 정보