我想查看列表中有多少个软件包未安装。我使用 archlinux,因此我使用 pacman -Q 来确定软件包是否已安装。如果未安装,它将返回一条消息,例如:“错误:未找到包‘包名称’”。
我想我可以grep -c 'error'
这样使用:
pacman -Q autoconf automake binutils bison fakeroot flex gcc libtool m4 make patch pkg-config | grep -c 'error'
但对我来说它返回:
错误:找不到包“bison”
错误:找不到包“pkg-config”
0
它返回 0,但我希望它返回 2。即使使用 awk,它也不起作用:
pacman -Q autoconf automake binutils bison fakeroot flex gcc libtool m4 make patch pkg-config | awk '/error: / {count++} END {print count}'
对我来说,这返回:
错误:找不到包“bison”
错误:找不到包“pkg-config”
所以我的猜测是该变量count
甚至没有值,因为它没有被打印。我也尝试过wc -l
,但这不起作用,它只是为我返回 0 。
打印未安装的软件包数量的正确方法是什么?
编辑:当我这样做时我注意到:
pacman -Q autoconf automake binutils bison fakeroot flex gcc libtool m4 make patch pkg-config > tempfile
cat tempfile
包含错误消息的两行不会添加到tempfile
(命令输出的其余部分会添加)。认为这可能有助于解决这个问题。
答案1
问题是错误消息没有发送到STDOUT
而是STDERR
。您STDERR
还必须显式重定向,例如:
pacman -Q bison patch pkg-config 2>&1 | grep -c 'error'
如果您有 bash 或 zsh 之类的东西,您可以使用|&
自动重定向STDOUT
以及STDERR
:
pacman -Q bison patch pkg-config |& grep -c 'error'
答案2
错误被打印到stderr
,而不是stdout
。您的管道 ( |
) 只能看到stdout
输出。您可以重定向stderr
到stdout
管道之前,然后所有输出都将通过grep
:
pacman -Q autoconf automake binutils bison fakeroot flex gcc libtool m4 make patch pkg-config 2>&1 | grep -c 'error'
答案3
您可以使用wc -l
它来计算输出的行数。
所以如果pacman -Q autoconf automake binutils bison fakeroot flex gcc libtool m4 make patch pkg-config | grep -c 'error'
输出:
error: package 'bison' was not found
error: package 'pkg-config' was not found
您可以运行pacman -Q autoconf automake binutils bison fakeroot flex gcc libtool m4 make patch pkg-config | grep -c 'error' | wc -l
来计算 grep 输出一行的次数。