linux 如何从“grep”中排除所有“permission denied”结果行?

rvpgvaaj  于 2023-02-07  发布在  Linux
关注(0)|答案(3)|浏览(618)

所以,问题是,我在linux终端上使用grep命令,我希望输出中没有所有以"grep:"开头的行或以"./"开头的行,因为现在我得到了这样的结果:

grep: ./users/blabla1: Permission denied
grep: ./users/blabla2: Permission denied
grep: ./users/blabla3: Permission denied
grep: ./users/blabla4: Permission denied
grep: ./users/blabla5: Permission denied
grep: ./users/blabla6: Permission denied
grep: ./users/blabla7: Permission denied
grep: ./users/blabla8: Permission denied
./foo/bar/log.log
./foo/bar/xml.xml

我试过这个:

grep -irl "foo" . | grep -v "Permission denied"

我也试过这个:

grep -irl "foo" . | grep -v "^grep:"

最后这个:

grep -irl "foo" . | grep "^./"

但我得到的结果总是一样,好像我没有在后面放任何东西一样|,有什么想法吗?我错过了什么?

mefy6pfw

mefy6pfw1#

您收到的消息是由于缺少对这些文件的权限,也就是说,这些是错误消息。
您所要做的就是将stderr(标准错误输出)重定向到/dev/null,如下所示:

grep -irl "foo" 2> /dev/null

要了解更多关于重定向(在bash上)的信息,请阅读本文:Bash参考手册-重定向

编辑:您也可以使用以下命令来隐藏错误消息:

grep -irl "foo" 2>&-
2q5ifsrm

2q5ifsrm2#

我更喜欢使用-s 'suppress'标志:

grep -irls "foo"

请注意grep手册页中的“可移植性说明”:
-s,--无消息
禁止显示有关文件不存在或不可读的错误消息。与GNU grep不同,第7版Unix grep不符合POSIX,因为它缺少-q,而且它的-s选项的行为与GNU grep的-q选项类似。USG风格的grep也缺少-q,但它的-s选项的行为与GNU grep类似。可移植shell脚本应该避免-q和-s,并且应该将标准和错误输出重定向到/dev/null。(-s由POSIX指定。)

vngu2lb8

vngu2lb83#

第一次尝试的结果:

grep -irl "foo" . | grep -v "Permission denied"

您只是缺少重定向标准错误的操作符。“|'重定向标准输出。如果添加'&',还将重定向标准错误,这就是向您发送“Permission denied”消息的原因。请尝试:

grep -irl "foo" . &| grep -v "Permission denied"

这对我很有效,因为由于某种原因,我的机器不喜欢“2〉/dev/null”选项。

相关问题