Text-Processing

掃描日誌、提取特定數據並創建輸出目錄的腳本

  • August 16, 2016

前段時間我問了一個關於如何從日誌文件中提取特定資訊的問題,並得到了一些有用的答案,但我還沒有得到我需要的東西。到目前為止我所擁有的:

#!/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”的目錄中根據他們的源文件命名。

當我的目標日誌目錄中只有一個文本文件時它可以工作,但是當我的目標目錄中有不同級別的目錄和日誌文件時它不起作用。我知道這是因為腳本中的“../errors-$file”位,但我不確定如何更改它。

任何幫助都會很棒,如果措辭不當,我會提前道歉。

我會戳你的循環本身,並嘗試了解它實際在做什麼,然後看看你如何實現你想要的。

你如何啟動你的循環過於復雜:ls | while read -r file;. 您正在將結果ls傳遞給您的while read,沒什麼大不了的,仍然有效,但我會推荐一個for更像是的循環:

for file in ./* ;

這將遍歷相同的文件,但更直接一些。此外,該ls命令可以返回不僅僅是文件名的輸出(是否注意到ls目錄/執行檔具有不同的字型顏色?),這可能會導致其他命令悲痛。

您的命令:egrep "ERROR|FAIL|WARN" > ../errors-$file正在嘗試egrep什麼都不做ERROR|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

引用自:https://unix.stackexchange.com/questions/303075