特定の単語をスキャンしようとしている大きなログファイルがあります。一般に、大きなログファイルでgrepを実行し、それらの単語を含む行を出力する必要がある単語はほとんどありません。
ファイルに対して単純なgrepを実行する方法を知っています。私のファイル名がabc.log
そして、「hello」という単語を含む行を見つける必要があります。その後、常にこのようにして、行を出力します。
grep -i "hello" abc.log
しかし、単語の組み合わせに対してgrepを実行する方法がわかりません。意味単語のリストがあり、abc.logファイルをスキャンしてそれらすべての単語を探し、それらの単語を含む行を個別に出力します。
#!/bin/bash
data="hello,world,tester"
# find all the lines which contains Word hello or world or tester
上記のシェルスクリプトでは、データ変数を分割してabc.logでhello Wordを探し、hello Wordを含むすべての行を出力し、同様にworldおよびtesterで出力します。
ログをgrepする実際のロジックに触れることなく、データ変数に単語のリストを追加するだけでよいように、これをかなり汎用的にしようとしています。
パターンを1行に1つずつファイルに保存する場合は、_grep -f file-with-patterns file-to-search.log
_を使用できます
Manページから:
_ -f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file
contains zero patterns, and therefore matches nothing. (-f is
specified by POSIX.)
_
2018年編集:
これを書いてから、次の興味深いEdgeのケースに気付きました。
-f -
_(stdinが不要な場合、つまりgrepのコマンドラインでファイルを指定した場合)または-f <()
(いずれにしても)を使用して、パイプからパターンのリストを読み取ることができます。grep
のパフォーマンスはひどく失敗し始めます。ユースケースが非常に狂っている場合は、sed
(または他の言語)スクリプトを生成してすぐに実行することを検討してください。ただし、パターンの重複に関する問題が発生する可能性があります。次のような正規表現を使用します。
grep -E 'hello|world|tester' abc.log
bruchowski's answer とは別に、以下も使用できます。
grep -i -e "hello" -e "world" -e "tester" abc.log
OR
grep 'hello\|world\|tester' abc.log
OR
egrep 'hello|world|tester' abc.log