使用grep来查找不包含给定string模式的文件
我在我的Web应用程序中使用以下命令来查找当前目录中包含stringfoo
(忽略svn目录)的所有文件。
find . -not -ipath '.*svn*' -exec grep -H -E -o "foo" {} \; > grep_results.txt
如何找出不包含单词foo
的文件?
如果你的grep有-L
(或者--files-without-match
)选项:
$ grep -L "foo" *
请看http://beyondgrep.com/ 。 它会自动为您排除.svn,为您提供Perl正则expression式,并且是一个简单的Perl程序下载。 相当于你正在寻找的应该是,在ack:
ack -L foo
我使用了以下内容:
grep -rL "foo" ./* | grep -v "\.svn"
不包括使用第二个grep过滤掉svn文件夹的需求。
最后,我按照朋友的build议正确使用了这个function:
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep 0
它给了我所有的文件,为零富有匹配:)
我祝你好运
grep -H -E -o -c "foo" */*/*.ext | grep ext:0
我用grep -v的尝试只给了我所有没有“foo”的行
你的朋友是“有点”的权利。 你实际上需要:
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep :0\$
否则,你将得到具有10行w /“foo”的文件,具有100行w /“foo”等的文件以及诸如“my_10_best_friends.txt”之类的具有“0”的行的文件。 。
我的grep没有任何-L选项。 我find解决办法来实现这一点。
这些想法是:
- 将所有包含应得string的文件名转储到txt1.txt。
- 将目录中的所有文件名转储到txt2.txt。
-
使用diff命令来区别2转储文件。
grep 'foo' *.log | cut -c1-14 | uniq > txt1.txt grep * *.log | cut -c1-14 | uniq > txt2.txt diff txt1.txt txt2.txt | grep ">"
find *20161109* -mtime -2|grep -vwE "(TRIGGER)"
您可以在“查找”下指定filter,在“grep -vwE”下指定排除string。 如果您需要在修改时间上进行过滤,请在查找下使用mtime。
我使用的是Ubuntu,我试过这个命令: cat file |grep -v "hehe"
这可以帮助你过滤包括子串“hehe”的行。
grep -irnw "filepath" -ve "pattern"
要么
grep -ve "pattern" < file
上面的命令会给我们结果,-vfind正在search的模式的逆