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