![複数のファイルから複数の文字列を出力する](https://rvso.com/image/38681/%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89%E8%A4%87%E6%95%B0%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B.png)
こんにちは、私の現在のコードは次のとおりです:
find /home/user/logfilesError/ -maxdepth 1 -type f -name "gBatch_*"\
-daystart -mtime -1 -exec grep -rl "ERROR" "{}" + | xargs -l basename
if [ $? -eq 0 ]; then
tday="$(date +'%d.%m.%Y')"
echo "ERROR found on $tday in the files obove!"
else
tday="$(date +'%d.%m.%Y')"
echo "No ERROR was found at the $tday !"
fi
コードは現在、この日(過去 24 時間ではない)に作成または編集されたログ ファイルを出力し、ログ ファイルに「ERROR」が含まれているかどうかを検索し、どのログ ファイルにエラーがあるか、またはエラーがない場合はそのことも表示します。
名前を少し検閲したので、それがうまく機能しない理由だとは思わないでください ;-)
出力(例):
gBatch_2070.log
gBatch_2071.log
ERROR found on 25.06.2014 in the files obove!
フォルダは次のようになります:
各ファイルは次のようになります。
希望する出力:
ファイル名 + 「ERROR」 + エラー後のメッセージ
例:
gBatch_2067.log - ERROR **.batch.BatchStart = バッチ処理が終了しました、gBatch_2077.log - ERROR **.batch.BatchStart = バッチ処理が終了しました、...
ご協力をよろしくお願いいたします!
答え1
検索するべきなのはこれです:
find /home/user/logfilesError/ -maxdepth 1 -type f -name "gBatch_*" -daystart -mtime -1 \
-exec grep -H "ERROR" {} \; | sed -e 's/.*\/gBatch_/gBatch_/g' -e 's/:[^E]*/: /g' | tr '\n' ', '
出力例:
gBatch_2070.log:ERROR **.batch.BatchStart = Batchverarbeitung beeendet, gBatch_2077.log - ERROR **.batch.BatchStart = Batchverarbeitung beeendet
gBatch_2070.log:ERROR **.batch.BatchStart = Batchverarbeitung beeendet, gBatch_2077.log - ERROR **.batch.BatchStart = Batchverarbeitung beeendet
gBatch_2071.log:ERROR **.batch.BatchStart = Batchverarbeitung beeendet, gBatch_2077.log - ERROR **.batch.BatchStart = Batchverarbeitung beeendet
...
説明:
-H
grepにファイル名も出力させるsed 's/.*\/gBatch_/gBatch_/g'
ファイル名を基本ファイル名にする
答え2
find /home/user/logfilesError/ -maxdepth 1 -type f -name "gBatch_*"\
-daystart -mtime -1 -exec grep -rl "ERROR" "{}" + | xargs -l basename\
> /tmp/files_found
if [ $? -eq 0 ]; then
tday="$(date +'%d.%m.%Y')"
while read line
do
error=`grep "ERROR" /home/user/logfilesError/$line`
error=`echo $error | sed 's/^.*ERROR/ERROR/' | tr '\n' ', '`
echo "$line - $error"
done < /tmp/files_found
echo "ERROR found on $tday in the files obove!"
rm /tmp/files_found
else
tday="$(date +'%d.%m.%Y')"
echo "No ERROR was found at the $tday !"
fi