성공적으로 전송되지 않은 이메일에 대한 이메일 서버 보고서를 저장하는 사서함 파일을 구문 분석하고 있습니다. 잘못된 이메일 주소를 추출하여 시스템에서 제거하고 싶습니다. 로그 파일은 다음과 같습니다.
...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;
이전 줄을 각각 삭제합니다.
이렇게 하면 패턴 공간에 그룹의 세 번째 줄이 남고 p
sed 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'