awk + 문자 간 이메일 주소를 캡처하는 방법

awk + 문자 간 이메일 주소를 캡처하는 방법

<와 문자 사이에 긴 이메일 목록이 있습니다 >.

smeimebv2t <jdyefc@nsuwtcvc>; jdedyvt <ejd2ydt2@dv2dg2vgv>; didi2jd2m     <i2dmi32@hd2vdg >; 3idm23i2m <2udhu2@cdrrc>
.
.
.

awk 또는 perl oneliner를 사용하여 사이의 이메일 주소만 캡처하려면 어떻게 해야 합니까 < >?

예:

more results.out

jdyefc@nsuwtcvc
ejd2ydt2@dv2dg2vgv
i2dmi32@hd2vdg
2udhu2@cdrrc

답변1

제가 생각할 수 있는 가장 쉬운 방법은 GNU를 사용하는 것입니다 grep.

$ grep -Po '<\K[^>]+(?=>)' file 
jdyefc@nsuwtcvc
ejd2ydt2@dv2dg2vgv
i2dmi32@hd2vdg 
2udhu2@cdrrc

이는 -o"줄의 일치하는 영역만 인쇄"를 의미하며 -PPerl 호환 정규식을 활성화합니다. 이것은 \K"지금까지 일치하는 항목을 일치의 일부로 처리하지 않는다"는 의미를 사용해 보겠습니다 .긍정적 인 전망. 따라서 정규식은 문자 <가 아닌 >문자와 일치하고 그 뒤에 >.

이는 <foo>이메일이 아닌 경우에도 일치합니다. 이메일(문자열 포함 @)만 제한하려면 다음을 사용할 수 있습니다.

grep -Po '<\K[^>]+@[^>]+(?=>)' file 

답변2

perl -lne 'print for /<\K[^>]+/g'

답변3

다이다이를 사용하세요:

awk -v RS="[<>]" '/@/' 

답변4

또 다른 변형:

perl -lne 'print $1 while /<(.*?)>/g'

괄호가 캡처되어 $1일치 .*?가 탐욕적이지 않게 됩니다. 즉, 가능한 한 빨리 중지합니다.

그리고 awk:

awk -F'<' '{ for(i = 2 ; i <= NF ; i++) { sub(/>.*/, "", $i); print $i; } } ' 

<s의 줄을 분할하고 첫 번째 부분을 무시하고 s로 시작하는 모든 항목을 제거한 후 다른 부분을 인쇄합니다 >. a 뒤에 아무것도 없으면 >줄의 나머지 부분이 인쇄됩니다 <.

관련 정보