2011-09-28 48 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系统的答案时:-)