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