たとえば、多くの電子メールアドレスを含む大きなテキストファイルがあり、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
そこにはメールをたくさん確認しています。そのうちの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