메시지는 완전한 헤더와 함께 텍스트 파일에 저장됩니다. (이 파일은 Thunderbird 메일 클라이언트의 받은 편지함에 있습니다. 파일 형식은 다음과 같습니다.Mboxted다양성. )
받은 편지함에 도달하기 전에 각 메시지가 통과하는 첫 번째 서버를 나열하는 방법은 무엇입니까? "수신됨" 줄에는 이메일이 통과한 서버가 나열됩니다. "수신됨" 줄을 아래에서 위로 읽습니다. 결론은 개시자입니다.
한 가지 옵션은 sed
, grep
, 등을 통한 awk
텍스트 처리를 위한 사용자 정의 스크립트 입니다. 또한 메일 분석기를 검색하여 찾았습니다.이메일 헤더 분석기(MHA),메일 디렉토리 도구그리고nmh - 메시지 처리 시스템. 먼저 이메일을 전달하는 서버 목록을 완성하기 위해 이러한 도구 중 하나를 사용하여 내 파일을 쿼리하는 것이 더 쉬울까요?
답변1
발생하는 상황에 따라 mbox 파일을 해당 구성 메시지의 근사치로 분할합니다.~에서(콜론 없이). 그런 다음 전체 컬렉션을 반복하고 마지막 컬렉션을 선택합니다.받았다각각의 제목.
mbox=/path/to/mbox/file
mkdir xx
(
cd xx
csplit -ksz -n5 "$mbox" '/^From /' '{*}'
for m in *
do
awk '
/^\r?$/ { gsub(/[\r\n[:space:]]+/, " ", received); print received; exit }
/^[^[:space:]]/ { flag = 0 }
/^Received:/ { received = $0; flag = 1 }
/^[[:space:]]/ && flag { received = received " " $0 }
' "$m"
done
)
rm -rf xx
원본 mbox 파일을 읽는 것은 어렵지 않지만 awk
, 솔루션을 만들기 시작했을 때 메시지를 사용하고 있었습니다. 쉘 루프를 사용하는 것보다 이 솔루션을 확장하는 것이 더 쉬워 보이지만 awk
돌이켜보면 아마도 어느 쪽이든 약 60:40에 불과했을 것입니다.
awk
스크립트가 한 번에 하나의 메시지를 처리한다는 점을 고려하면 다음과 같습니다.formail
(원래는논평에서procmail
모음곡)를 사용하여 mbox 형식 파일의 메시지를 반복할 수 있습니다.
formail < "$mbox" -s awk '....'
답변2
awk '/^Received: / {
LASTREAD=$0
exit
}
/^\r{0,1}$/ {
if "" == LASTREAD {
exit 1
}
print LASTREAD
exit 0
}
END {
if "" == LASTREAD {
exit 1
}
print LASTREAD
}'
(검증되지 않은).
그러면 일치하는 첫 번째 행이 추출됩니다. 이것이 첫 번째 점프인지 여부는 또 다른 문제입니다. 내용의 구조는 다를 수 있습니다.