2016-04-26 152 views
0

我正在尋找瑣碎的解決方案,爲平凡的任務。使用bash在txt文件中搜索

我的bash腳本循環了幾個文件夾,其中產生了一些log.txt文件。如果每種情況下的某些操作在每個日誌中都成功執行,那麼應該在log.txt中的某處出現帶有句子「The unit is OK」的字符串,但是每個log.txt中它的實際位置(字符串的精確數量)是不同的!

我需要在我的循環中放入一些條件(可能使用IF)來檢查該句子是否實際存在於日誌文件中某處,如果是這樣 - 在執行腳本的終端中打印「一切正常」在特定文件夾循環的時刻,否則(如果該日誌中沒有該字符串)打印像「壞消息」一樣的!

將感謝不同的解決方案,尤其是如何在給定的日誌文件中找到所選短語的字符串。

謝謝!

格列布

回答

0

沒有更多的信息(字符串的例子,你正在尋找的,潛在的文件名,無論bash腳本你已經有了),它是很難提供具體的建議。

不過,如果你有一組已知的潛在串的,你可以在一個文件中檢查他們的存在,而你循環

if [ `grep -E (pattern1|pattern2|pattern3) $FILE | wc -l` -gt 0 ]; then 
    # String was found in file 
fi 
+1

你可以使用'grep -q':'if grep -qE'(pattern1 | pattern2 | pattern3)'「$ FILE」;然後' – andlrc

+1

'$ FILE'周圍缺少雙引號。反引號('''')用於舊式命令替換,例如'富= \'命令\''。建議使用'foo = $(command)'語法。 '$()'內的反斜槓處理並不令人驚訝,'$()'更容易嵌套。見http://mywiki.wooledge.org/BashFAQ/082。而且 - 無用的'wc -l'和命令'['。相反,要求像上面註釋中顯示的@andlrc一樣詢問grep的退出狀態。 –

1

要測試應用到整個目錄,一個簡單的for環能被使用。如果您需要遞歸處理目錄,則可以提供while read -r...循環,結果爲find。在任何一種情況下,搜索都是相似的。下面是一個例子搜索的日誌文件,一個目錄:

$ for i in dirname/*; do grep -q 'The unit is OK' "$i" && \ 
echo "$i - Everything is OK" || echo "$i - Bad news"; done 

搜索其中dirname是我的測試dat目錄,例如結果將是:

dat/test.properties - Bad news 
dat/test_pph_s.txt - Bad news 
dat/testlog-1.txt - Everything is OK 
dat/testlog-2.txt - Everything is OK 
dat/testlog-3.txt - Everything is OK 

testlog-X.txt文件包含,例如:

$ cat dat/testlog-1.txt 
The unit is OK 
0

使用某種模式掃描文件(例如:log.txt)

for file in $(find /path/to/logs -name "log.txt") 
do 
    grep -q "The unit is OK" $file && echo "$file: Everything is OK" || echo "$file: Bad news" 
done 
+3

千萬不要這樣做:'for $ in $(command)'或'$ var'。 * for-in *用於迭代參數,而不是(輸出)字符串。相反,使用glob(例如'* .txt'),數組(例如'''$ {names [@]}'')或者一個while-read循環(例如'while read -r line')。參見[Bash Pitfalls 1](http://mywiki.wooledge.org/BashPitfalls#pf1)和[不要閱讀with的行](http://mywiki.wooledge.org/DontReadLinesWithFor)。 –