在 archlinux 中使用 grep/awk 从列表中找出我还没有安装的程序有多少

在 archlinux 中使用 grep/awk 从列表中找出我还没有安装的程序有多少

我想查看列表中有多少个软件包未安装。我使用 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输出。您可以重定向stderrstdout管道之前,然后所有输出都将通过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 输出一行的次数。

相关内容