如何在管道后使用反向grep?

3

我想在文件服务器上列出目录磁盘使用情况。同时,我也想忽略错误信息。以下是我的命令:

du -sh * | grep -v "Permission denied" | sort -n

结果仍包含“permission denied”行:
du: cannot access './myFile1/': Permission denied
du: cannot access './myFile2/': Permission denied
du: cannot access './myFile3/': Permission denied

我哪里做错了?


将标准错误输出到管道中,同时发送标准错误输出。2>&1 - 123
1个回答

6
这是因为“Permission denied”是通过标准错误输出而不是标准输出发送的。
如果你不想看到这个信息,可以将stderr重定向到/dev/null来消除它:
du -sh * 2>/dev/null | sort -n

所有这些错误信息都会发生:

$ touch a
$ ls a asfasd
ls: cannot access asfasd: No such file or directory
a
$ ls a asfasd | grep cannot
ls: cannot access asfasd: No such file or directory
$ ls a asfasd 2>/dev/null  
a

1
是的,我也在打同样的东西,只不过比较慢。:-) 重定向比反向grep更好,因为你不需要知道可能发生的各种错误。 - donjuedo
它能起作用,但你能解释一下内部是怎么运行的吗?数字 2 是什么意思? - fonzane
1
@fonzane 2 指的是标准错误输出(stderr)。也就是说,这是“错误”的输出。例如,如果你执行 ls somefile alsdjflaksdj 命令,并且 somefile 存在而第二个文件不存在,那么 1(标准输出)会显示第一个文件的信息,而 2 会显示类似于 "ls: cannot access..." 的错误提示。 - fedorqui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接