gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:32:03 26 4
gpt4 key购买 nike

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

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/

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