grep으로 정확한 문자열 찾기 사용하여 전자 메일이 존재하는지 (또는 없음) 검색

예를 들어, 전자 메일 주소가 많은 큰 텍스트 파일을 bash를 사용하여 전자 메일이 존재하는지 (또는 없음) 검색 / 확인해야합니다. “앵커”만 사용해야합니까?

grep '^user1@example.com' text_file

아니면 더 좋은 방법이 있습니까? bash 스크립트를 만들어야하며 안전하고 싶습니다.



답변

참고 항목 -F(고정 문자열과 같은 정규 표현식에 반대) 및 -x(: 전체 라인에 맞는 정확한) 옵션을.

grep -Fx user1@example.com text_file

다음과 같습니다.

grep '^user1@example\.com$' text_file

( .모든 문자와 일치하는 정규식 연산자임을 기억하십시오 ).

-q이러한 행이 있는지 확인하려는 경우이 옵션을 사용하십시오 .

grep -Fxq user1@example.com text_file &&
  echo yes, that address is in that file.

검색 할 행과 파일 이름이 변수 인 경우 :

grep -Fxqe "$email" < "$file"

또는

grep -Fxq -- "$email" < "$file"

당신은 원하지 않습니다 :

grep -Fxq "$email" "$file"

로 시작 $email하거나 $file시작 하면 문제가 발생할 수 있습니다 -.

파일이 (현재 로케일에서, 가급적이면 C) 정렬되면 다음 comm대신에 속도를 높일 수 있습니다 grep.

printf '%s\n' user1@example.com | comm -12 - text_file

확인해야 할 이메일 주소가 여러 개인 경우 (예 : 다른 정렬 된 파일) 이점이 더 분명해집니다.

comm -12 text_file emails_to_check

다음보다 빠를 것입니다.

grep -Fxf emails_to_check text_file


답변

가능한 한 효율적으로하려면 첫 번째 일치 항목을 찾은 후 중지하려고합니다. GNU가있는 grep경우 다음을 수행 할 수 있습니다.

grep -m 1 '^user1@example\.com$' your_file

그렇지 않으면 Perl을 사용할 수 있습니다.

perl -nlE 'say and last if $_ eq q{user1@example.com}' your_file


답변

이메일 확인이 많이 있습니다. 그 중 하나는 다음과 같습니다.

grep -E -o "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" text_file

내 대답을 정교하게합니다.

^문자열의 시작을 나타내는 앵커를 사용하고 있습니다. 이메일 주소가 긴 문자열 사이에 있으면 일치하지 않습니다.


답변

당신의 grep명령으로 시작 모든 일치 ^user1@example.com뿐만 아니라, 이메일 주소 자체를 포함하여, user1@example.com.spammer.com. 이후 .모든 키와 일치하는 정규 표현식의 특수 문자가, 당신은 그것을 탈출한다\.

텍스트 파일에 한 줄에 하나의 주소가 있다고 가정하면 다음을 사용하십시오.

EMAIL=user1@example\\.com
egrep "^${EMAIL}$" text_file

후행 $은 이메일 주소 다음에 줄이 끝나는 지 확인합니다. 나는 또한 큰 따옴표를 사용하고 "이러한 (작은 따옴표는 달리 변수를 사용할 수 있도록 같이 ')


답변

일반적인 리터럴 / 정확한 문자열 일치를 고려하십시오.

grep -w "search_word" <file>  >  output.txt

#\b shows boundaries over here.

또는,

 grep  "\bsearch_word\b"  <file>  >  output.txt


답변