2011-09-28 64 views
2

我有一個包含一組文本文件的文件夾。linux在一個文件中搜索多個詞

-Folder 
--- file 1 
--- file 2 
--- file 3 
--- file 4 

我有一套詞,我想檢查是否在裏面。 {word1, username, blah blahblah}

有沒有辦法在單個命令中發現哪些文件包含我的列表中的所有單詞?

我看到有可能使用一些和grep,但我認爲他們在一條線上工作,而在我的情況下,情緒總是在不同的線上。

單詞的數量是靜態的。總是3或4,所以如果需要的話,我可以在命令中硬編碼它們。

編輯: 他們在和。一個文件不被接受,如果沒有它們裏面的所有!我想避免 egrep -l'word1'。 xargs egrep -l'word2'

是否有更好的解決方案來調用grep一次?

乾杯, 步驟

回答

7

這是否適合您?

grep -IRE 'word1|username|blah blahblah' /path/to/files/ | 
sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P' | 
awk -F: '$1!=p{if(b"" && c > 2)print b; p=$1;c=0;b=s=""}{b=b s $0;s=RS;c++}END 
{if(b"" && c > 2)print b}' | awk -F: '{print $1}' | sort -u 

第一部分(grep)將列出所有具有匹配模式的文件名。第二部分(sed)會從第一個輸出中去除只有不同行的副本。第三部分將只顯示不止一次出現的文件,第四部分將刪除您的匹配模式,最後一部分將只爲您提供我的朋友的文件名。

我的頭現在疼...

4

使用:

grep -f words.txt input 

實施例:

$ cat words 
word1 
username 
blah blahbla 

a 
word1 
username blah blahblah 
b 
username blah blahblah 
c 
word1 
d 
word1, username, blah blahblah} 

$ grep -f words.txt * 
a:word1 
a:username blah blahblah 
b:username blah blahblah 
c:word1 
d:word1, username, blah blahblah} 
3

使用grep:

grep -E '(word1|username|blah blahblah)' Folder/* 

-E所述標誌把grep的成正則表達式的'擴展'模式。這將默認顯示文件名和匹配的文本。如果您只想要文件名,請將-l添加到選項中。

+0

不起作用。在TE當前文件夾中文件1包含WORD1 WORD2 WORD3 word4 的word5 (在不同的線) 如果我使用grep -E '(WORD1 | WORD2)'。我得到空 – Stefano

+0

一些發行版也有'egrep',它與'grep -E'相同,其他所有選項都與'grep'相同。 –

1

另一種解決方案,哪個最適合一小部分的話:

grep -e word1 -e username -e "blah blahblah" Folder/* 
+0

問題是,我多次返回文件的名稱。有沒有辦法避免重複? – Stefano

1

,如果你想用grep到一個目錄樹

egrep -E '{word1|username|blah blahblah)' `find . -type f -print` 

我建議你也使用術語以下目錄而不是文件夾當您搜索關於* nix系統的答案時:-)