sed/awk/grep 필터링된 txt 파일의 이메일을 구문 분석합니다.

sed/awk/grep 필터링된 txt 파일의 이메일을 구문 분석합니다.

여러 개의 txt 파일이 있고 파일에 "Provider"라는 텍스트가 포함되어 있으면 파일에서 이메일을 추출하고 싶습니다. 텍스트 파일의 형식이 다릅니다. "공급자"는 텍스트의 어느 곳에나 나타날 수 있습니다.

다음은 몇 가지 간단한 예입니다.
파일 1.txt
이름: Joe1
공급자
...
이메일[이메일 보호됨]

파일 2.txt
이름: Joe2
...
고객
...
이메일[이메일 보호됨]

파일 3.txt
이름: Joe3
... 이메일
제공
[이메일 보호됨]

이 단축 코드를 사용하고 있지만 모든 이메일이 반환됩니다.

$ awk -F, '{
  for (i=1; i<=NF; i++)
    if ($i ~ /@/)
       print $i
}' *

도와주세요?

감사해요

답변1

$ awk 'FNR==1 { provider = False } 
       $0 ~ /Provider/ { provider = True} 
       $0 ~ /@/ && provider == True {
         for (i=1; i<=NF; i++) {
           if ($i ~ /@/) print $i;
         }
       }' *
  • 첫 번째 줄로 provider설정된 각 파일에 대해False
  • 줄에 다음이 포함되어 있으면 Provider공급자를 다음으로 설정하세요.True
  • 줄에 이 포함되어 있고 @해당 단어가 이전에 본 적이 있는 경우 Provider필드를 반복하고 단어가 포함된 필드를 인쇄합니다.@

답변2

당신은 시도 할 수 있습니다:

for fname in file*.txt
do
    if grep 'Provider' ${fname} &> /dev/null ; then
       grep -oP 'Email[[:space:]]*\K(.*@.*)' ${fname}
    fi
done

답변3

grep -l Provider file*.txt | xargs grep -o '[^@[:space:]]+@[^@[:space:]]+'

[0-9a-zA-Z._%+-]+@[0-9a-zA-Z.-]+\.[a-zA-Z]{2,}예를 들어 더 정확해야 하는 경우에는 이메일 주소에 대해 더 정확한 정규식이 있습니다 .

관련 정보