![在 archlinux 中使用 grep/awk 从列表中找出我还没有安装的程序有多少](https://linux22.com/image/24483/%E5%9C%A8%20archlinux%20%E4%B8%AD%E4%BD%BF%E7%94%A8%20grep%2Fawk%20%E4%BB%8E%E5%88%97%E8%A1%A8%E4%B8%AD%E6%89%BE%E5%87%BA%E6%88%91%E8%BF%98%E6%B2%A1%E6%9C%89%E5%AE%89%E8%A3%85%E7%9A%84%E7%A8%8B%E5%BA%8F%E6%9C%89%E5%A4%9A%E5%B0%91.png)
我想查看列表中有多少个软件包未安装。我使用 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 输出一行的次数。