我有一个包含一组文本文件的文件夹。
-Folder
--- file 1
--- file 2
--- file 3
--- file 4
我有一套单词,我想检查是否在里面。 {word1, username, blah blahblah}
单个命令是否有办法发现哪个文件包含列表中的所有单词?
我看到有可能使用一些和grep,但我认为它们只能在一条线上工作,而在我的情况下,这种情况总是在不同的线上。
单词的数量是静态的。总是3或4所以如果需要我可以在命令中硬编码。
修改 他们在AND。如果文件中没有全部内容,则不接受该文件! 我想避免这样做 egrep -l'word1'。| xargs egrep -l'word2'
有没有更好的解决方案只调用一次grep?
干杯, STE
答案 0 :(得分: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)将从第一个输出中删除重复项,只给出不同的行。第三部分只显示多次出现的文件,第四部分将删除匹配的模式,最后一部分只会为您提供我的朋友的文件名。
我的头疼了......
答案 1 :(得分: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}
答案 2 :(得分:3)
使用grep:
grep -E '(word1|username|blah blahblah)' Folder/*
-E
标志将grep置于正常表达式的“扩展”模式。这将默认显示文件名和匹配的文本。如果您只想要文件名,请在选项中添加-l
。
答案 3 :(得分:1)
另一种解决方案,最适用于一小组词:
grep -e word1 -e username -e "blah blahblah" Folder/*
答案 4 :(得分:1)
如果您想要进入目录树
,请执行以下操作egrep -E '{word1|username|blah blahblah)' `find . -type f -print`
我建议您在搜索有关* nix系统的答案时使用术语目录而不是文件夹: - )