Text-Processing
掃描日誌、提取特定數據並創建輸出目錄的腳本
前段時間我問了一個關於如何從日誌文件中提取特定資訊的問題,並得到了一些有用的答案,但我還沒有得到我需要的東西。到目前為止我所擁有的:
#!/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