unix - Grep:递归选项在输入管道输入时会产生意外行为

标签 unix grep pipe

多年来,我一直在许多环境中成功使用此实用程序。但我注意到在一个特定的环境中,它会产生非常意想不到的结果。

grep -r 'search-term1' . | grep 'search-term2'

上面的代码对当前目录中 search-term1 的所有实例递归地进行 grep。然后将结果传送到另一个 grep,它只选择那些也包含 search-term2 的行。这完全符合我的预期。
grep -r 'search-term1' . | grep -r 'search-term2'

上面代码的唯一区别是在两个 grep 命令中都指定了 -r 递归标志。我希望这种特殊情况下的行为不会改变。毕竟,第二个 grep 的输入是管道输入,并且没有什么可以递归找到的。

多年来,我一直在许多不同的环境(unix 和 mac-os)中成功使用该命令。但是,我开始在 (unix) 中工作的最新环境打破了上述行为。第二个管道 grep 搜索 search-term2 的所有实例,不仅在管道输入中,而且在我当前目录中的所有文件中。因此,我不是只获得包含两个搜索词的结果,而是在 current-dir 中获得包含第二个搜索词的所有结果。

有什么理由为什么这个特定的环境会产生这种奇怪的行为吗?有什么办法可以避免这种情况,同时仍然保留 -r 标志?

常问问题:

问:为什么我在管道输入上使用 -r 标志?

Ans:我实际上将 grep 保存为别名,其中有许多不同的选项和标志,我总是想将它们用作默认值。递归标志就是其中之一。我想总是使用这个别名,而不是每次都输入所有的标志。

问:如果要搜索与两个搜索词都匹配的所有实例,为什么不做 (insert-superior-method-here) 呢?

答:你可能是对的。我确信我可以改变我通常的习惯来解决这个问题。然而,作为求知欲,我想知道为什么递归 greps-on-pipes 在大多数环境中都能按预期工作,但不是全部,以及是否可以以某种方式解决。

最佳答案

-r grep 版本 2.11 中更改为 grep 的标志( release notes 如果没有给出文件参数,则隐式使用工作目录作为输入。

If no file operand is given, and a command-line -r or equivalent option is given, grep now searches the working directory.



你没有给第二个 grep任何文件参数,所以它默认为当前目录,尽管有管道输入。

试试 grep -r 'search-term1' . | grep -r 'search-term2' -作为解决方法。
grep -r 'search-term1' . | grep -r -d skip 'search-term2'也可以解决这个问题。

关于unix - Grep:递归选项在输入管道输入时会产生意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31569279/

相关文章:

unix - 在 grep 之后获取一行的一部分

shell - 一行中的多个字符串的 grep

linux - grep -c 不工作

c - 使多个管道等待每个进程的返回码

c - 将一个 child 的标准输出通过管道传输到 c 中另一个 child 的标准输入

python - 使用子进程 popen 运行列表命令字符串并获取输出

linux - Bash:字符串操作在空格处终止

linux - 有人可以解释下面的代码和下面的查询吗

linux - grep命令查找字符出现n次

bash - 将输出管道输出到具有多个输入的 bash 函数