我想搜索包含'even:suspendcount> 0'和'even:holdcount> 0'的文件。这两个文本字符串必须位于文件中的某个位置,而不必位于同一行。我遇到的问题是我的搜索结果没有拉回包含#5行的文本和第10行的另一个文本的文件。如果文件位于同一行号,则仅撤回文件。如何在文件中的某个位置搜索包含多个文本字符串的文件,它们不必位于同一行。
答案 0 :(得分:0)
grep
模式是面向行的,即在你的情况下它应该是'even:suspendcount> 0' OR 'even:holdcount> 0'(即{{1} })。
答案 1 :(得分:0)
使用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 '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)。
/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}
如果f
和g
都为真(非零),则打印文件名并跳至下一个文件。