我需要搜索包含两个或两个以上特定单词的文件(在我的例子中是NORMAL
(,因此从以下文件中:
file1.txt:
the NORMAL things are [
- case
- case 2
a NORMAL is like [
- case 3
- case 4
]
]
file2.txt:
the NORMAL things are [
- case
- case 2
a DIFFERENT is like [
- case 3
- case 4
]
]
file3.txt:
the NORMAL things are [
- case
- case 2
]
它只能找到file1.txt。
我尝试了一个简单的grep
:
grep -Ri "*NORMAL*NORMAL*" .
但它不起作用。
感谢
如果您不希望递归搜索:
grep -lzE '(NORMAL).*1' files*
如果您确实希望递归搜索:
grep -rlzE '(NORMAL).*1' .
此命令在当前目录中递归检查文件中包含NORMAL
和NORMAL
(1
(的文件。这意味着它将匹配2个或多个匹配项。这只是打印文件名,删除-l
即可打印内容+文件名。
-l
:只有当与grep
匹配时,才会打印文件名-z
:数据行以0字节结束,而不是换行-E
:使用扩展正则表达式-r
:recursive
使用grep -c
打印匹配计数:
grep -c 'PATTERN' file(s)
在您的情况下,您还需要第二个grep -Pv
或类似的东西来根据匹配数进行筛选(此处,排除匹配数为0或1的文件(:
grep -c 'NORMAL' files | grep -P -v ':[01]$'
此处,:[01]
::
后跟0或1(选择0或1个匹配项($
:行的末尾。
另请参阅:
-c
--count
禁止正常输出;而是为每个输入文件打印匹配行的计数。使用-v(--inverte-match(选项,count不匹配的行。(-c由POSIX指定。(-p
--perl-regexp
将模式解释为perl兼容的正则表达式(PCRE(。-v
-反转匹配
反转匹配感,选择不匹配的行。(-v由POSIX指定。(
(来自GNU Grep 3.4(
fgrep-c'NORMAL'文件*|awk-F":"'$NF>=2{打印}'
file1.txt:2
如果你也想打印搜索结果,那么
fgrep-c"NORMAL"文件*|awk-F":"'$NF>=2{print}'| grep NORMAL$(awk-F":"{print$1}"(
正常情况是[
NORMAL类似[
使用grep-o选项:
例如:
grep -o NORMAL file1.txt | wc -l --> 2
grep -o NORMAL file2.txt | wc -l --> 1
grep -o NORMAL file3.txt | wc -l --> 1
现在这可以与if子句一起使用:
if [ `grep -o NORMAL file1.txt | wc -l` -ge 2 ];then echo "Count is greater than or equal to 2";else echo "Count is less than 2";fi