예를 들어, 많은 이메일 주소가 포함된 큰 텍스트 파일이 있고 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
을 대신 사용하여 작업 속도를 높일 수 있습니다.comm
grep
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