2014-10-10 26 views
5

我有一個很大的日誌文件,我試圖掃描它的特定單詞。一般來說,我會用幾句話來說明我的大日誌文件,並打印出包含這些單詞的行。如何grep在日誌文件中包含特定單詞的行?

我知道如何在文件上執行簡單的grep。假設如果我的文件名是abc.log,我需要找到一個包含單詞「hello」的行,那麼我總是這樣做,它會爲我打印出行。

grep -i "hello" abc.log 

但我不知道如何做的單詞組合grep。這意味着我會列出單詞,我將掃描我的abc.log文件中的所有單詞,然後我將單獨列出包含這些單詞的行。

#!/bin/bash 

data="hello,world,tester" 

# find all the lines which contains word hello or world or tester 

所以在我上面的shell腳本我會分裂我的數據變量和abc.log所以它包含你好字的任何行找你好的話,我將與世界試驗機打印出來,同樣也是如此。

我想使這個非常通用,以便我只需要添加我的數據變量中的單詞列表,而不必觸及對日誌進行格式化的實際邏輯。

回答

6

如果您在文件中存儲你的模式,每行一個,你可以使用grep -f file-with-patterns file-to-search.log

從手冊頁:

-f FILE, --file=FILE 
      Obtain patterns from FILE, one per line. The empty file 
      contains zero patterns, and therefore matches nothing. (-f is 
      specified by POSIX.) 
+0

感謝o11c。在我的情況下,模式可能會增長很多,所以文件方法很好,但我想在此添加一件事 - 如果包含特定單詞,請不要打印出該行。我將如何用你目前的方法來做到這一點? – john 2014-10-10 04:51:20

+0

@ user2809564通過'grep -v wordtoexclude'(或'-e'或'-f'等)管理第一個'grep' – o11c 2014-10-10 04:54:28

+0

謝謝。有可能我可以有多種模式以便排除,所以有什麼辦法可以讓一個文件包含模式來排除,然後使用這個文件來執行grep? – john 2014-10-10 05:01:00

6

我會使用一個正則表達式,像這樣:

grep -E 'hello|world|tester' abc.log 
+0

非常感謝bruchowski。它工作正常。在我的情況下,我可以有三個以上的模式,所以我正在考慮將它存儲在一個變量中,就像我在問題中顯示的一樣,然後分割該變量並開始對其進行格式化,或者將其存儲在文件中。你認爲在shell腳本中使用這個通用的更好的方法嗎? – john 2014-10-10 04:55:16

+0

@ user2809564因爲命令行參數的長度是有限的,所以這種方法最終會失敗,而文件不會。我不確定你的數據集是不是很大。 – o11c 2014-10-10 04:56:50

+0

@ user2809564任何一個都是不錯的方法。如果你不打算搜索太多的字符串,那麼我可能會採用這種內聯方法,只需在'|'上加入一系列術語,否則@ o11c的答案對你來說會很好 – bruchowski 2014-10-10 04:57:14

0

除了bruchowski's answer,您還可以使用:

grep -i -e "hello" -e "world" -e "tester" abc.log 

OR

grep 'hello\|world\|tester' abc.log 

OR

egrep 'hello|world|tester' abc.log 
相關問題