gpt4 book ai didi

linux - 链接多个 "grep -r"调用

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:02 25 4
gpt4 key购买 nike

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

grep X * | grep -vl Y

...但不幸的是他们不是。如果我尝试加入 -r 选项来递归我的文件系统:

grep -r X * | grep -v Y

这是行不通的。如果我加入 -l 选项(让它打印文件路径而不是文件中的行),它也不起作用:

grep -rl X * | grep -v Y

但是,我觉得必须有一种方法来组合 grep -r 调用,而且我觉得我已经接近解决方案了,所以......任何人都可以使用更好的 grep 技能可以帮助我了解链接此类调用的模式吗?

最佳答案

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

首先,举个例子来证明:(省略了递归部分只是为了使构建示例更容易)

==> one_two.txt <==
11111111
222222222

==> one.txt <==
1111111111111

==> two.txt <==
22222222222

比方说,X1Y2,也就是我们要找文件包含 1 但不包含 2

显然,只有 one.txt 应该在结果中。

答案A:(接受的那个)

kent$  grep -r 1 | grep -v 2 | cut -f1 -d':' | uniq  
one.txt
one_two.txt

答案B:

kent$  grep -vl "2" `grep -rl "1" *`       
one_two.txt
one.txt

所以两者都给出了错误的结果。

工作解决方案:

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

解释

grep -v pattern 是错误的方法,因为如果文件中的任何行与模式不匹配,它将报告匹配。我们想要的是,找到两组文件(匹配 X 和匹配 Y),做一个减法 XSet - YSet

关于linux - 链接多个 "grep -r"调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34345530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com