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

时间:2017-05-17 18:40:00

标签: grep

我想搜索包含'even:suspendcount> 0'和'even:holdcount> 0'的文件。这两个文本字符串必须位于文件中的某个位置,而不必位于同一行。我遇到的问题是我的搜索结果没有拉回包含#5行的文本和第10行的另一个文本的文件。如果文件位于同一行号,则仅撤回文件。如何在文件中的某个位置搜索包含多个文本字符串的文件,它们不必位于同一行。

2 个答案:

答案 0 :(得分:0)

grep模式是面向行的,即在你的情况下它应该是'even:suspendcount> 0' OR 'even:holdcount> 0'(即{{1} })。

答案 1 :(得分:0)

使用grep

使用grep获取 两个 字符串的文件:

grep -lZ 'even:suspendcount>0'  * | xargs --null grep -l 'even:holdcount>0'

工作原理:

  • grep -lZ 'even:suspendcount>0' *

    这将返回包含字符串even:suspendcount>0的文件名称的以分隔开的列表。

  • xargs --null grep -l 'even:holdcount>0'

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

    的文件的名称

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

使用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}

    当我们开始阅读新文件时,变量fg设置为零(false)。

  • /even:suspendcount>0/{f=1}

    如果我们遇到包含even:suspendcount>0的行,则将变量f设置为1。

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

    同样,我们遇到包含even:holdcount>0的行,然后将变量g设置为1。

  • f && g{print FILENAME; nextfile}

    如果fg都为真(非零),则打印文件名并跳至下一个文件。