Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux “链多”;grep-r";电话_Linux_Grep - Fatal编程技术网

Linux “链多”;grep-r";电话

Linux “链多”;grep-r";电话,linux,grep,Linux,Grep,我正在尝试查找所有具有模式X但没有模式Y的文件(即文件列表,而不是这些文件中的行列表)。如果我的所有文件都在一个目录中,这将是微不足道的: grep X * | grep -vl Y 。。。但不幸的是,他们不是。如果我尝试加入-r选项以在文件系统中递归: grep -r X * | grep -v Y 它不起作用。如果我加入-l选项(使其打印文件路径而不是文件中的行),它也不起作用: 然而,我觉得必须有一种方法来组合grep-r调用,我觉得我已经接近解决方案了,所以。。。任何具有更好的gre

我正在尝试查找所有具有模式X但没有模式Y的文件(即文件列表,而不是这些文件中的行列表)。如果我的所有文件都在一个目录中,这将是微不足道的:

grep X * | grep -vl Y
。。。但不幸的是,他们不是。如果我尝试加入
-r
选项以在文件系统中递归:

grep -r X * | grep -v Y
它不起作用。如果我加入
-l
选项(使其打印文件路径而不是文件中的行),它也不起作用:


然而,我觉得必须有一种方法来组合
grep-r
调用,我觉得我已经接近解决方案了,所以。。。任何具有更好的
grep
技能的人都能教我一种链接此类调用的模式吗?

编辑:这不起作用,因为我没有正确创建测试用例。见下文

给定如下设置:

mkdir a
echo "xpat" > a/yes1.txt
echo "xpat noty" > a/yes2.txt
echo "xpat\nypat" > a/no1.txt

mkdir b
echo "something\nelse\nxpat" > b/yes3.txt
echo "ypat\nsomething\nxpat" > b/no2.txt
echo "not that" > b/no3.txt
要查找包含xpat但不包含ypat的文件的位置(三个yes?.txt文件):

下面是正确的测试用例,它失败了

mkdir a
echo "xpat" > a/yes1.txt
echo "xpat noty" > a/yes2.txt
echo "xpat
ypat" > a/no1.txt

mkdir b
echo "something
else
xpat" > b/yes3.txt
echo "ypat
something
xpat" > b/no2.txt
echo "not that" > b/no3.txt

grep -vl "ypat" `grep -rl "xpat" *`

a/yes1.txt
a/no1.txt
a/yes2.txt
b/yes3.txt
b/no2.txt

我仍在思考原因。

编辑:这不起作用,因为我没有正确创建测试用例。见下文

给定如下设置:

mkdir a
echo "xpat" > a/yes1.txt
echo "xpat noty" > a/yes2.txt
echo "xpat\nypat" > a/no1.txt

mkdir b
echo "something\nelse\nxpat" > b/yes3.txt
echo "ypat\nsomething\nxpat" > b/no2.txt
echo "not that" > b/no3.txt
要查找包含xpat但不包含ypat的文件的位置(三个yes?.txt文件):

下面是正确的测试用例,它失败了

mkdir a
echo "xpat" > a/yes1.txt
echo "xpat noty" > a/yes2.txt
echo "xpat
ypat" > a/no1.txt

mkdir b
echo "something
else
xpat" > b/yes3.txt
echo "ypat
something
xpat" > b/no2.txt
echo "not that" > b/no3.txt

grep -vl "ypat" `grep -rl "xpat" *`

a/yes1.txt
a/no1.txt
a/yes2.txt
b/yes3.txt
b/no2.txt
我仍在思考原因。

这是:

grep -r X | grep -v Y | cut -f1 -d':' | uniq
生成包含包含X而不是Y的行的所有文件

这:

生成包含X而不是Y的所有文件。也就是说,
X_文件
是包含
X
的所有文件,
Y_文件
是包含Y的所有文件,它将生成
X_文件-Y_文件


例如。设置:

mkdir test && cd test
echo foo      > a.txt
echo foo bar >> a.txt
第一种情况:

$ grep -r foo | grep -v bar
a.txt:foo
第二种情况:

$ grep -rl bar > tmp.x
$ grep -rl foo --exclude-from=tmp.x ; rm tmp.x
不产生任何结果。

这:

grep -r X | grep -v Y | cut -f1 -d':' | uniq
生成包含包含X而不是Y的行的所有文件

这:

生成包含X而不是Y的所有文件。也就是说,
X_文件
是包含
X
的所有文件,
Y_文件
是包含Y的所有文件,它将生成
X_文件-Y_文件


例如。设置:

mkdir test && cd test
echo foo      > a.txt
echo foo bar >> a.txt
第一种情况:

$ grep -r foo | grep -v bar
a.txt:foo
第二种情况:

$ grep -rl bar > tmp.x
$ grep -rl foo --exclude-from=tmp.x ; rm tmp.x

什么也不产生。

我会发布一个新的答案,尽管OP已经接受了其中一个。因为到目前为止,这两个答案并不适用于所有情况
grep-v
不是正确的方法

首先,用一个例子来证明这一点:(省略递归部分只是为了简化构建示例)

答复B: 所以两者都给出了错误的结果

工作解决办法:
kent$awk'NR==FNR{a[$0]+;next}$0在{delete a[$0]}END{for(x in a)print x}'我会发布一个新的答案,尽管OP已经接受了其中一个。因为到目前为止,这两个答案并不适用于所有情况
grep-v
不是正确的方法

首先,用一个例子来证明这一点:(省略递归部分只是为了简化构建示例)

答复B: 所以两者都给出了错误的结果

工作解决办法:

kent$awk'NR==FNR{a[$0]++;next}$0在{delete a[$0]}结尾{for(a中的x)print x}'
grep-rx | grep-vy
将显示所有包含x的文件中的所有行,并过滤掉所有包含Y的行。这是您想要做的吗,或者,是否要列出
grep-rx
中的文件并减去
grep-vy
生成的文件?对不起,应该已经澄清了(我将编辑我的答案)。我希望生成一个文件列表,而不是一个行列表。好吧,那么您正在查找
grep-rx | grep-vy | cut-f1-d':“| uniq
?这正是我要找的。如果你把它放在一个答案中,我会很高兴地接受它(尽管纯粹出于好奇,我仍然想知道是否有一种方法可以用
grep
…但这真的不重要)。我不知道我是否理解你的要求是正确的,如果一个文件的
X
Y
在不同的行中,你不想让文件进入结果,对吗?如果是真的,
grep-v
不是正确的选择。
grep-rx | grep-vy
将显示所有包含X的文件中的所有行,并过滤掉所有也包含Y的行。这是您要做的,还是,是否要列出
grep-rx
中的文件并减去
grep-vy
生成的文件?对不起,应该已经澄清了(我将编辑我的答案)。我希望生成一个文件列表,而不是一个行列表。好吧,那么您正在查找
grep-rx | grep-vy | cut-f1-d':“| uniq
?这正是我要找的。如果你把它放在一个答案中,我会很高兴地接受它(尽管纯粹出于好奇,我仍然想知道是否有一种方法可以用
grep
…但这真的不重要)。我不知道我是否理解你的要求是正确的,如果一个文件的
X
Y
在不同的行中,你不想让文件进入结果,对吗?如果这是真的,
grep-v
不是正确的方法。如果
X
Y
在同一个文件中,并且位于不同的行中,这将不起作用,是吗?@Kent这是正确的,这就是它的意图。然而,现在看来这不是正确的解释。如果
X
Y
在同一个文件中,并且位于不同的行中,这将不起作用,是吗?@Kent这是正确的,这就是它的意图。但现在看来这不是正确的解释。我接受了肯尼的答案,因为两个答案对我来说都一样好,而他(在评论中)首先回答了。但是,如果你提供了一个纯粹基于
grep
的答案,你会得到额外的分数,因此我希望我可以投票两次:)这确实是一种方法,如果要求是“a是所有包含X的文件,B是所有包含Y的文件:显示所有a不在B中”,尽管如果有带空格的路径,可能会有问题。除了错误之外,因为我的测试用例不正确:两种模式都不适用于p
kent$  awk 'NR==FNR{a[$0]++;next} $0 in a{delete a[$0]}END{for(x in a)print x}' <(grep -rl 1) <(grep -rl 2)
one.txt