2009-05-03 3 views
2

폴더에 여러 개의 파일이 있으며 각각 하나의 전자 메일 메시지가 있습니다. 서식 글꼴
: [email protected]
보낸 사람 : 보낸 사람 이름
bash의 보낸 사람 이름에 대한 전자 메일 메시지를 구문 분석합니다.

메시지 본문 내가 싶어

모든 고유 보낸 각 메시지는

주제 형식의 헤더가 모든 메시지의 이름 (파일 당 하나의 메시지 만 있음). 어떻게해야합니까?

cat * | grep '^From: ' | sort -u 

"에서"오해의 소지가 다른이있을 수 있습니다 경우 메시지의 중간에 선 임의의 헤더는 메시지의 중간에있을 수없는 가정

답변

2

,이 트릭을 할해야 , 당신은 당신 만과 같이, 각 메시지에서 일치하는 첫 번째 라인을 받고 있는지 확인해야합니다

for f in * ; do cat $f | grep '^From: ' | head -1 | sort -u ; done 

는 분명히 다른 글로브 또는 파일 이름의 목록 중 하나를 명령에서 *를 교체 할 수 있습니다.

+0

나는'| 정렬 | uniq' 그 후 – kch

+0

당신이 맞습니다 ... 나는 원래 질문의 '독특한'부분을 놓쳤습니다. 나는 '| sort -u'를 추가하기 위해 나의 대답을 업데이트했다. ('| sort | uniq'도 잘 동작 할 것입니다). – John

+0

Purely academic : From 필드가 머리글에 없지만 해당 줄이 본문에 있으면 어떻게됩니까? –

0

보낸 사람 이름이나 전자 메일 주소를 필터링 하시겠습니까?

ls | while read filename 
do 
    grep '^From: ' $filename | head -n1 | sed 's/^From: //;s/ *<[^>]*> *//;s/^"//;s/"$//' 
done | sort -u 
: 보통은

From: Lessie <[email protected]> 

는 AS 당신이 이런 일에 끝나는 전자 메일 주소 부분

sed 's/^From: //;s/ *<[^>]*> *//' 

을 제거 sed을 사용할 수 라인 "에서"모두가

0

몇 가지 답변을 강화하십시오. (내가 언급을 아직 충분히 명성을 필요가 없습니다.) 다음은 충분해야한다 :

grep -m 1 '^From: ' * | sed -'s/^From: *//' | sort -u 

디렉토리에있는 모든 메시지를 당신에게 주소에서 고유의 목록을 제공합니다. 주소 부분을 지우고 싶다면 che 응답과 같은 sed 명령을 더 추가 할 수 있습니다. '고양이 *'가 필요하지 않습니다. grep '.

관련 문제