ログをスキャンし、特定のデータを抽出し、出力ディレクトリを生成するスクリプト

ログをスキャンし、特定のデータを抽出し、出力ディレクトリを生成するスクリプト

私が一度尋ねたことがあります。質問ログファイルから特定の情報を抽出する方法についてしばらく前に投稿して役に立つ回答を得ましたが、必要な情報を取得できませんでした。私が今まで持っているもの:

#!/bin/bash


mkdir result

cd $1
ls | while read -r file;
do
egrep "ERROR|FAIL|WARN" > ../errors-$file
done
cd ..

mv errors-* result

これが私が望むものです。ログディレクトリをスキャンし、ERROR | FAIL | WARNを含むテキストのすべての行(一部は複数行)をキャプチャし、それを各個々のファイルとともに "result"という名前のディレクトリに出力するスクリプトです。ソースファイルに応じて。

ターゲットログディレクトリにテキストファイルが1つしかない場合は機能しますが、ターゲットディレクトリに異なるレベルのディレクトリとログファイルが含まれている場合は機能しません。私はこれがスクリプトの "../errors-$file"ビットのためであることを知っていますが、それを変更する方法がわかりません。

どんな助けでもいいでしょう。不適切に表現された場合は、事前にお詫び申し上げます。

ベストアンサー1

私はあなたのループ自体を調べて、それが実際に何をしているのかを理解し、あなたが望むことを達成する方法を学びたいと思います。

ループを開始する方法が複雑すぎますls | while read -r file;。結果をlsあなたのものにパイプすることはwhile read大きな問題ではありませんが、それでも機能しますが、for次のようなループをお勧めします。

for file in ./* ;

これは同じファイルを繰り返しますが、もっと簡単です。また、このlsコマンドはファイル名以上の出力を返す可能性があるため(lsディレクトリ/実行ファイルのフォントの色が異なるのを見たことがありますか?)、これは他のコマンドに問題を引き起こす可能性があります。

あなたのコマンドは何もせずにegrep "ERROR|FAIL|WARN" > ../errors-$file出力を 。egrepERROR|FAIL|WARN../errors-$file

構文は次egrepのとおりです。

egrep [search pattern] [location]

egrepだから見なければならない点を見逃した。$fileパターンの後に追加することでこの問題を解決できます。

#!/bin/bash


mkdir result

cd $1
for file in $(find ./ -type f)
do
egrep "ERROR|FAIL|WARN" $file > ../result/errors-$(basename $file)
echo "-------------------------------" >> ../result/errors-$(basename $file)
egrep "denied" -B 1 $file >> ../result/errors-$(basename $file)
done

おすすめ記事