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

そこにはメールをたくさん確認しています。そのうちの1つは次のとおりです。

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 

関連情報