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

Posted

技术标签:

【中文标题】如何从“grep”中排除所有“permission denied”结果行?【英文标题】:How can I exclude all “permission denied” result lines from “grep”? 【发布时间】:2016-07-01 04:41:54 【问题描述】:

所以,问题是,我在使用 grep 命令的 linux 终端上,我希望输出没有在开头打印的所有行“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 "^./"

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

【问题讨论】:

【参考方案1】:

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

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

要了解有关重定向的更多信息(关于 bash),请阅读这篇文章: Bash Reference Manual - Redirections

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

grep -irl "foo" 2>&-

【讨论】:

我自己解释的不是很清楚,顺便非常感谢。我知道我没有权限,也拿不到。问题是,我不知道 grep 的结果,不是所有的都在./foo,它们可能在任何地方,我可以得到./foo./bar,我只想丢弃所有的结果显示我没有权限。 @gleba,这就是重定向应该做的。将显示除 Permission denied 条目 (stderr) 之外的所有结果 (stdout)。您可以在末尾添加 2> /dev/null 重新测试您的命令 因此有了这个非常清晰的答案,我终于明白了2> 在终端中的含义(很难搜索)【参考方案2】:

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

grep -irls "foo"

注意 grep 手册页中的“可移植性说明”:

-s, --no-messages

抑制有关不存在或不可读文件的错误消息。可移植性说明:与 GNU grep 不同,第 7 版 Unix grep 不符合 POSIX,因为它缺少 -q 并且其 -s 选项的行为类似于 GNU grep 的 -q 选项。 USG 风格的 grep 也缺少 -q,但其 -s 选项的行为类似于 GNU grep。可移植的 shell 脚本应该避免使用 -q 和 -s 并且应该将标准和错误输出重定向到 /dev/null。 (-s 由 POSIX 指定。)

【讨论】:

我认为这是满足要求的更好答案。可以在官方文档中搜索-s标志link 记住这一点的提示是,您正在寻找名为“foo”的“女孩”:grep -irls "foo"

以上是关于如何从“grep”中排除所有“permission denied”结果行?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 git grep 搜索中排除某些目录/文件

如何从 ack (ack-grep) 中排除特定文件?

rm排除指定文件或指定文件夹下文件

使用查找时排除文件夹[重复]

使用 grep 进行文件搜索,不包括结果中的字段 [关闭]

Linux ls -R 列出文件,如何不显示没有权限的目录提升“permission denied”