为什么递归 grep 不适用于 STDOUT?

为什么递归 grep 不适用于 STDOUT?

我长期以来一直习惯在我的 Ubuntu/Mint 机器上使用一些自定义别名,例如alias grep='grep -irn --color --line-buffered'.然而,我注意到,从不久前开始,这不再适用于管道输出。

尝试调试时,我注意到有问题的选项是递归选项,它不是 grep'ping STDOUT,而是从当前目录递归搜索。

我目前正在运行 grep 2.16,并且我发现一台机器可以按我预期运行 2.10。

例子: tail -f /var/log/xxx.log | grep -irn yyy

-r/-d recurse使 grep 搜索文件夹而不是按照目录选项进行了哪些更改man

-d ACTION, --directories=ACTION
    If an input file is a directory, use ACTION to process it.
    [...] If ACTION is recurse, read all files under each directory, recursively,
    following symbolic links only if they are on the command line. This is
    equivalent to the -r option.

答案1

这个答案更适合评论,但太长了,所以我将其发布为答案。

grep 的行为激起了我的兴趣,我认为 OP 走在正确的轨道上,我还发现新版本的 grep 的行为与旧版本不同。在旧版本中,如果您在使用时没有传递参数,则-r只会在标准输入中搜索模式,因为它应该根据文档:grep searches the named input FILEs (or standard input if no files are named, or if a single hyphen-minus (-) is given as file name) for lines containing a match to the given pattern。然而,在较新的版本中,即使您没有提供任何文件名,它也会在当前目录中搜索模式。检查一下:

$ mkdir /tmp/grep-test
$ cd /tmp/grep-test
$ echo pam > FILE
$ grep --version
grep (GNU grep) 2.10
(...)
$ grep pam -r
pam
pam
$ /home/ja/grep/grep-2.16/src/grep pam -r
FILE:pam

除了 grep 更改日志之外,我没有发现任何提及与此相关的任何更改:

** 行为改变

-r (--recursive) 选项现在仅遵循命令行符号链接。另外,默认情况下 -r 现在仅读取在命令行上命名的设备;这可以用 --devices 覆盖。 -R 的作用与以前一样,因此如果您更喜欢遵循所有符号链接并默认读取所有设备的旧行为,请使用 -R。

为什么 OP 要递归地搜索标准输出仍然是一个问题,但 grep 中肯定发生了一些变化。

相关内容