grep을 사용하여 정확한 문자열 찾기

grep을 사용하여 정확한 문자열 찾기

예를 들어, 많은 이메일 주소가 포함된 큰 텍스트 파일이 있고 bash를 사용하여 이메일이 존재하는지(또는 존재하지 않는지) 검색/확인해야 합니다. "앵커"만 사용해야 합니까?

grep '^[email protected]' text_file

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

답변1

-F(정규 표현식이 아닌 고정 문자열) 및 -x(정확히: 전체 줄 일치) 옵션을 참조하세요 .

grep -Fx [email protected] text_file

다음과 동일:

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

(이것은 .모든 문자와 일치하는 정규식 연산자라는 점을 기억하십시오.)

-q그러한 행이 존재하는지 확인하려면 다음 옵션을 사용하십시오.

grep -Fxq [email protected] 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을 대신 사용하여 작업 속도를 높일 수 있습니다.commgrep

printf '%s\n' [email protected] | comm -12 - text_file

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

comm -12 text_file emails_to_check

다음보다 빠릅니다:

grep -Fxf emails_to_check text_file

답변2

최대한 효율적으로 수행하려면 첫 번째 일치 항목을 찾은 후 중지하려고 합니다. GNU가 있다면 grep다음과 같이 할 수 있습니다:

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

그렇지 않은 경우 Perl을 사용할 수 있습니다.

perl -nlE 'say and last if $_ eq q{[email protected]}' your_file

답변3

거기에는 이메일을 많이 확인하고 있습니다. 그 중 하나는 다음과 같습니다

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

내 대답을 자세히 설명합니다.

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

답변4

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

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

#\b shows boundaries over here.

또는,

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

관련 정보