如何从查找输出中过滤那些“权限被拒绝”?

Ben*_*old 9 linux grep sed find stderr

sed最近开始使用。我使用它的一种方便的方法是忽略日志文件中不重要的行:

tail -f example.com-access.log | sed '/127.0.0.1/d;/ELB-/d;/408 0 "-" "-"/d;'
Run Code Online (Sandbox Code Playgroud)

但是当我尝试与 类似地使用它时find,结果并不如预期。我试图忽略包含“权限被拒绝”的任何行,如下所示:

find . -name "openssl" | sed '/Permission denied/d;'
Run Code Online (Sandbox Code Playgroud)

但是,我仍然在stdout.

编辑

正如下面的正确答案中提到的,“权限被拒绝”消息出现在stderr和 NOT 中stdout

cuo*_*glm 18

问题是错误输出打印到stderr,因此sed命令无法捕获输入。简单的解决方案是:将 stderr 重定向到 stdout。

find . -name "openssl" 2>&1 | sed '/Permission denied/d;'
Run Code Online (Sandbox Code Playgroud)

  • @Gnouc:“2>1”将标准输出(文件描述符 2)重定向到名为“1”的文件。它与“2>&1”不同,其中“&1”表示“文件描述符1,又名标准输出”。 (3认同)

小智 16

我不确定您为什么要尝试使用从输出中sed删除权限被拒绝的消息find- 除非您正在尝试学习如何使用sed.

我会简单地运行这个:

找 。-name "openssl" 2>/dev/null

在这里,我将stderr(文件描述符2)重定向到/dev/null(请参阅man null)。换句话说,2>/dev/null只需丢弃写入stderr 的所有内容。