在具有新行的文本之间搜索包含两个或两个以上特定单词的文件



我需要搜索包含两个或两个以上特定单词的文件(在我的例子中是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' .

此命令在当前目录中递归检查文件中包含NORMALNORMAL(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

最新更新