web-dev-qa-db-ja.com

同じ文字列で複数のファイルを同時にgrepする方法は?

確認する必要がある一連のログファイルがあり、同じファイルの特定の文字列を一度に検索したいのですが、これは可能ですか?現在使用しています

grep -E 'fatal|error|critical|failure|warning|' /path_to_file

これを使用して、一度に複数のファイルの文字列を検索するにはどうすればよいですか?これをスクリプト化する必要がある場合、誰かがこれを行う簡単なスクリプトを提供できますか?

66
user53029
grep -E 'fatal|error|critical|failure|warning|' *.log
68
JigarGandhi

次のようなものを使用できます:

find . -name "*.log" | xargs grep -E 'fatal|error|critical|failure|warning|'

これにより、.logを拡張子として使用し、grepコマンドを適用します。

23
jherran

単純な場合は、各ファイルを順番に指定するだけです。

grep -E 'fatal|error|critical|failure|warning' file1.log file2.log 
20
flickerfly

正規表現では取得できないファイル名の任意のセットをgrepする必要がある場合:

grep -E 'fatal|error|critical|failure|warning|' `cat<<FIN
> file1
> file2
> ...
> filen
> FIN`

ファイル名を次々に貼り付けることの利点は何ですか?ファイル名リストをテキストファイルにコンパイルして貼り付けることができます。

3
Diego Pino

サブディレクトリファイルも再帰的に検索する場合は、以下のコマンドを使用できます

サブディレクトリファイルも再帰的に検索します

egrep -r "string1|string2" pathname
1

JigarGandhiの回答 は、アスタリスクのワイルドカードの使用を示しています。それらはもっとあり、あなたはそれらを見ることができます here またはman 7 globを実行することによって。

そのうちの1つは、[]との範囲一致です。私が取り組んでいるシステムは、連続番号の付いたログファイルを生成します(例:product.log.1product.log.2...product.log.200)。3つまたは4つの順次ファイルに対して単一のコマンドでgrepするのは便利ですが、それ以上はできません。 。したがって、この

grep 'whatever' product.log.[5-7]

product.logで終わるすべてのファイルをgrepします。 5、6、または7。ワイルドカードを最後に置く必要はないので、 flickerflyの答え は、

grep -E 'fatal|error|critical|failure|warning' file[1,2].log

また、これらのワイルドカードは、cpなどの他のコマンドでも使用できます。

0

これは非常に時間のかかる作業でした。もちろん、複数の異なるログで同時に複数の文字列を検索する場合は、スクリプトを作成する必要があります。しかし、私は最近これを行わなければならず、それは非常に苦痛でした。それにもかかわらず、これは完了して準備ができており、次のリンクからダウンロードできます。

ログ検索スクリプトのダウンロード

これが機能する方法は非常に簡単です。

シナリオ1:1つのログファイルで1つの文字列を監視する

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open' '.'  1 2 single_errCheck -ndshow

シナリオ2:1つのログファイルで複数の文字列を監視する

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_errCheck -ndshow

シナリオ3:複数のログファイルで単一/複数の文字列を監視する

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_err_multi_logCheck -ndshow

注:

_P_はOR-「_P_」を含む文字列を検索する必要が少ないため、パイプ「|」記号を置き換えます。「_ P_」を入力したくない場合、_P_を "|"に置き換えることができます。

このスクリプトを使用する場合、頻繁に変更するパラメーターは次のとおりです。

  1. 監視するログファイルまたはログディレクトリ
  2. ログファイルを監視するために必要な経過時間。タイムスタンプが60分を超えるログファイルを監視または検出しない
  3. 監視したい文字列/パターン
  4. タグ-これは、指定する必要がある最後から2番目の引数です。/var/tmp/logXrayで監視しているログファイルに関する統計情報を記録します
  5. ログオプション-ndshow-これは、指定したパターンに一致するログからエントリを出力する場合に使用するパラメーターです。検出された各パターンの総数を表示するだけの場合は、「-ndshow」を「-ndfoundmul」に置き換えます。

「-ndfoundmul」を使用すると、次のような出力が得られます。

[root@dgphxtest001]# ./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 blahblahA -ndfoundmul
OK: [/var/log/messages][1]  /var/log/messages:P=(can_t_open=0 ntpd_stat=0)_F=(117s)_R=(228,228=0) 

元の投稿者の問題の解決策:複数のログファイルで複数の文字列をスキャンします

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'fatal_P_error_P_critical_P_failure_P_warning' '.'  1 2 multierr_logCheck -ndshow

OSes:これはUbuntuとRed Hatでテストされました

0
grep -EFn "fatal|error|critical|failure|warning|search-string" /path/to/the/file/log_file?.lo* --color=auto

これは、'log_file?'で始まる名前のファイルで'fatalまたはerror、criticalまたはfailureまたはwarningまたはsearch-string'を検索します。パス/ path/to/the/file /内の拡張子'lo' *および検索文字列にランダムな色を指定し、見つかった行番号を出力しますで。

0
Obaid

ファイルがすべて同じフォルダーである場合は、中括弧を使用することもできます。

例を見る

grep -E 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

Sをgrepに追加すると、ファイルの欠落に関するエラーが抑制されます

grep -sE 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

OSの違いにより、1つのファイルと他のファイルにある複数のディストリビューションで機能するコマンドを実行するために、私はこれを自分で試してみました。

メールログ

Sudo grep -is [email protected] /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog}

2>/dev/nullを使用してアーカイブされたメールログで、zgrepの欠落している.gz警告を抑制

Sudo zgrep -is [email protected] /var/log/{maillog*,exim_mainlog*,exim_rejectlog*,mail.log*,mail.err*,syslog*} 2>/dev/null

参照: パス全体を再入力せずにディレクトリ内の複数のファイルを参照する方法はありますか?

0
mike