Grep字符串的整个文件,而不是逐行

Grep字符串的整个文件,而不是逐行,grep,Grep,我想搜索包含“偶数:suspendcount>0”和“偶数:holdcount>0”的文件。这两个文本字符串必须位于文件中的某个位置,不一定在同一行。我遇到的问题是,我的搜索结果没有调回在第5行和第10行分别包含一段文字的文件。只有当文件在同一行号上时,才会将其向后拉。我如何搜索文件中某个位置包含多个文本字符串的文件,它们不必在同一行。Agrep模式是面向行的,即在您的情况下,它应该是“偶数:suspendcount>0”或“偶数:holdcount>0”(即grep-e”偶数:(suspend

我想搜索包含“偶数:suspendcount>0”和“偶数:holdcount>0”的文件。这两个文本字符串必须位于文件中的某个位置,不一定在同一行。我遇到的问题是,我的搜索结果没有调回在第5行和第10行分别包含一段文字的文件。只有当文件在同一行号上时,才会将其向后拉。我如何搜索文件中某个位置包含多个文本字符串的文件,它们不必在同一行。

A
grep
模式是面向行的,即在您的情况下,它应该是“偶数:suspendcount>0”或“偶数:holdcount>0”(即
grep-e”偶数:(suspend | hold)count>0'
).

一个
grep
模式是面向行的,即在您的情况下,它应该是“偶数:suspendcount>0”或“偶数:holdcount>0”(即
grep-e“偶数:(suspend | hold)count>0”。

使用grep 要使用grep获取同时具有两个字符串的文件,请执行以下操作:

grep -lZ 'even:suspendcount>0'  * | xargs --null grep -l 'even:holdcount>0'
工作原理:

  • grep-lZ'偶数:suspendcount>0'*

    这将返回包含字符串
    偶数:suspendcount>0
    的文件名的nul分隔列表

  • xargs--null grep-l'偶数:holdcount>0'

    在第一步选择的文件中,这将返回也包含
    偶数:holdcount>0

    因为我们在将文件名从一个进程传递到下一个进程时使用nul分隔,所以这种方法即使对于困难的文件名也是安全的

使用awk 这将打印包含两个字符串的任何文件的文件名:

awk 'BEGINFILE{f=0;g=0} /even:suspendcount>0/{f=1} /even:holdcount>0/{g=1} f && g{print FILENAME; nextfile}' *
工作原理:

  • BEGINFILE{f=0;g=0}

    当我们开始读取一个新文件时,变量
    f
    g
    被设置为零(false)

  • /偶数:suspendcount>0/{f=1}

    如果遇到一行包含
    偶数:suspendcount>0
    ,则将变量
    f
    设置为1

  • /even:holdcount>0/{g=1}

    类似地,我们遇到一行包含
    偶数:holdcount>0
    ,然后将变量
    g
    设置为1

  • f&&g{print FILENAME;nextfile}

    如果
    f
    g
    均为真(非零),则打印文件名并跳到下一个文件

使用grep 要使用grep获取同时具有两个字符串的文件,请执行以下操作:

grep -lZ 'even:suspendcount>0'  * | xargs --null grep -l 'even:holdcount>0'
工作原理:

  • grep-lZ'偶数:suspendcount>0'*

    这将返回包含字符串
    偶数:suspendcount>0
    的文件名的nul分隔列表

  • xargs--null grep-l'偶数:holdcount>0'

    在第一步选择的文件中,这将返回也包含
    偶数:holdcount>0

    因为我们在将文件名从一个进程传递到下一个进程时使用nul分隔,所以这种方法即使对于困难的文件名也是安全的

使用awk 这将打印包含两个字符串的任何文件的文件名:

awk 'BEGINFILE{f=0;g=0} /even:suspendcount>0/{f=1} /even:holdcount>0/{g=1} f && g{print FILENAME; nextfile}' *
工作原理:

  • BEGINFILE{f=0;g=0}

    当我们开始读取一个新文件时,变量
    f
    g
    被设置为零(false)

  • /偶数:suspendcount>0/{f=1}

    如果遇到一行包含
    偶数:suspendcount>0
    ,则将变量
    f
    设置为1

  • /even:holdcount>0/{g=1}

    类似地,我们遇到一行包含
    偶数:holdcount>0
    ,然后将变量
    g
    设置为1

  • f&&g{print FILENAME;nextfile}

    如果
    f
    g
    均为真(非零),则打印文件名并跳到下一个文件


感谢您的快速回复。这样,它不会显示包含1个或两个文件的文件吗?我想我已经查看了这个选项,但它正在提取“偶数:suspendcount>0”但“偶数:HoldCount>1”的文件,并且这样做是因为OR。我只需要显示包含两个文本字符串的文件,但它们不必位于同一个字符串上line@TAnderson说得对。然后,一行方法是
[$(…| grep-Eo'偶数:(suspend | hold)count>0'| sort-u | wc-l)=2]
(即至少有一个
hold
匹配和至少一个
suspend
匹配)。感谢您的快速响应。这样,它不会显示包含1个或两个文件的文件吗?我想我已经查看了这个选项,但它正在提取“偶数:suspendcount>0”但“偶数:HoldCount>1”的文件,并且这样做是因为OR。我只需要显示包含两个文本字符串的文件,但它们不必位于同一个字符串上line@TAnderson说得对。一行方法是
[$(…| grep-Eo'偶数:(suspend | hold)count>0'| sort-u | wc-l)=2]
(即至少有一个
hold
匹配,至少有一个
suspend
匹配)。谢谢,这很有魅力。我想,如果我只知道这一点,我可以得到其余的,但现在遇到了另一个问题,当我试图搜索同样包含“scheduleelement”以及我已经提到的其他2个文件时。下面的代码是我正在使用的,它正在显示文件,但似乎将它们都显示为一个文件名,仅在单独的行中。我在'File name too long'grep-lZ'schedulelement'*|xargs--null grep-l'偶数:suspendcount>0'|xargs--null grep-l'偶数:holdcount>0'@TAnderson你非常接近了。我们需要告诉第二个
grep
生成nul分隔输出。因此,将第二个
grep
-l
替换为
-lZ
grep-lZ'schedulelement'*| xargs--null grep-lZ'偶数:s