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


57

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

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

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


2
grep複数のファイル引数を取ることができます。
jw013 14

回答:


61
grep -E 'fatal|error|critical|failure|warning|' *.log

grepディレクトリをスキップしながら、すべてのファイルを再帰的にチェックするにはどうすればよいですか?grep -E 'text' **/*動作しますが、各サブディレクトリのためのエラーメッセージを表示します(その後、正しく内のすべてのファイルをチェックします)
ジョーン

4
@Jorn、本当に新しい質問をする必要がありますが、使用してくださいfind . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
ワイルドカード

20

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

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

これにより.log、拡張子を持つすべてのファイルが検索され、grepコマンドが適用されます。


それはあまりにも簡単だった:)実は私のすべてのファイルのは、「そうはgrep -E .logのされている。!あまりにも動作します.logに『致命的な|エラー|重要| |失敗警告』 *を感謝
user53029

1
理解/適応user53029の多大な努力!
ジルケノ14

1
なぜあなたがちょうど使用できるのに、ファイル名の空白の深刻な破損xargsの可能性を気にしますか?find . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +
ワイルドカード

16

より単純な場合は、各ファイルを次々に指定できます。

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

2
とてもシンプルですが、これを探しすぎていました:0
アダムヒューズ

3

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

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

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



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

OS:これはUbuntuおよびRed Hatでテストされました


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

これは、「log_file?」で始まる名前のファイルで「致命的またはエラーまたは重大または失敗または警告または検索文字列」検索しますパス/ path / to / the / file /の拡張子'lo ' *を使用して、検索文字列にランダムな色を付け、見つかった行番号を出力します。


確かにこれは有効な答えですが、ユーザーはパターンを使用して検索するように要求し、固定の検索文字列を使用して答えました。申し訳ありませんが、行番号や結果の色付けなど、求められていないものを追加しても、回答がより有益になるとは限りません。しかし、あなたのgrepスキルに答えられる可能性のある他の質問があるので、USEキャリアで幸運を祈ります!
ザグリムサン

@zagrimsanポイントを取得し、-E 'fatal | error | critical | failure | warning |'を追加しました それへのパラメータ。
オベイド

また、検索パターンではなく、複数のファイルを具体的に要求しました。質問をもう一度読んでください。
オベイド

Q: "特定の文字列を検索する"から引用すると、質問は彼が使用する検索パターン(一致する複数の文字列を含む)を示しています。ただし、質問のタイトルは、彼が本当に求めているものとは少し異なります。ところで、-Eかつ-F同時に使用することはできません、彼らは(タイプミスを?)矛盾しています。
ザグリムサン

0

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

そのうちの1つが便利だとわかったのは、との範囲一致[]です。私が取り組んでいるシステムは連続番号のログファイルを生成するので、例えばproduct.log.1 product.log.2 ... product.log.200、3つまたは4つの連続ファイルで1つのコマンドで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

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

例を見る

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

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

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

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

メールログ

sudo grep -is bob@example.com /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog}

2> / dev / nullを使用してzgrepが.gzの警告を表示しないようにアーカイブしたメールログ

sudo zgrep -is bob@example.com /var/log/{maillog*,exim_mainlog*,exim_rejectlog*,mail.log*,mail.err*,syslog*} 2>/dev/null

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.