確認する必要がある一連のログファイルがあり、同じファイルの特定の文字列を一度に検索したいのですが、これは可能ですか?現在使用しています
grep -E 'fatal|error|critical|failure|warning|' /path_to_file
これを使用して、一度に複数のファイルの文字列を検索するにはどうすればよいですか?これをスクリプト化する必要がある場合、誰かがこれを行う簡単なスクリプトを提供できますか?
grep -E 'fatal|error|critical|failure|warning|' *.log
次のようなものを使用できます:
find . -name "*.log" | xargs grep -E 'fatal|error|critical|failure|warning|'
これにより、.log
を拡張子として使用し、grep
コマンドを適用します。
単純な場合は、各ファイルを順番に指定するだけです。
grep -E 'fatal|error|critical|failure|warning' file1.log file2.log
正規表現では取得できないファイル名の任意のセットをgrepする必要がある場合:
grep -E 'fatal|error|critical|failure|warning|' `cat<<FIN
> file1
> file2
> ...
> filen
> FIN`
ファイル名を次々に貼り付けることの利点は何ですか?ファイル名リストをテキストファイルにコンパイルして貼り付けることができます。
サブディレクトリファイルも再帰的に検索する場合は、以下のコマンドを使用できます
サブディレクトリファイルも再帰的に検索します
egrep -r "string1|string2" pathname
JigarGandhiの回答 は、アスタリスクのワイルドカードの使用を示しています。それらはもっとあり、あなたはそれらを見ることができます here またはman 7 glob
を実行することによって。
そのうちの1つは、[]
との範囲一致です。私が取り組んでいるシステムは、連続番号の付いたログファイルを生成します(例:product.log.1
product.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
などの他のコマンドでも使用できます。
これは非常に時間のかかる作業でした。もちろん、複数の異なるログで同時に複数の文字列を検索する場合は、スクリプトを作成する必要があります。しかし、私は最近これを行わなければならず、それは非常に苦痛でした。それにもかかわらず、これは完了して準備ができており、次のリンクからダウンロードできます。
これが機能する方法は非常に簡単です。
シナリオ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_を "|"に置き換えることができます。
このスクリプトを使用する場合、頻繁に変更するパラメーターは次のとおりです。
「-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でテストされました
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' *および検索文字列にランダムな色を指定し、見つかった行番号を出力しますで。
ファイルがすべて同じフォルダーである場合は、中括弧を使用することもできます。
例を見る
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