web-dev-qa-db-ja.com

ログファイルに特定の単語を含む行をgrepする方法は?

特定の単語をスキャンしようとしている大きなログファイルがあります。一般に、大きなログファイルで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する実際のロジックに触れることなく、データ変数に単語のリストを追加するだけでよいように、これをかなり汎用的にしようとしています。

12
john

パターンを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(または他の言語)スクリプトを生成してすぐに実行することを検討してください。ただし、パターンの重複に関する問題が発生する可能性があります。
9
o11c

次のような正規表現を使用します。

grep -E 'hello|world|tester' abc.log
15
bruchowski

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
1
Mandar Shinde