我长期以来一直习惯在我的 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 中肯定发生了一些变化。