Descobri quantos programas eu não instalei de uma lista com o grep / awk no archlinux

2

Eu quero ver quantos pacotes de uma lista não estão instalados. Eu uso o archlinux, então eu uso o pacman -Q para determinar se um pacote está instalado. Se não estiver instalado, ele retornará uma mensagem como: "error: package 'package-name' não foi encontrado".

Eu achei que poderia usar grep -c 'error' assim:

pacman -Q autoconf automake binutils bison fakeroot flex gcc libtool m4 make patch pkg-config | grep -c 'error'

Mas, para mim, isso retorna:

error: package 'bison' was not found
error: package 'pkg-config' was not found
0

Ele retorna 0, mas eu gostaria que ele retornasse 2. Mesmo com o awk ele não funciona:

pacman -Q autoconf automake binutils bison fakeroot flex gcc libtool m4 make patch pkg-config | awk '/error: / {count++} END {print count}'

Para mim, isso retorna:

error: package 'bison' was not found
error: package 'pkg-config' was not found

Então, meu palpite é que a variável count nem sequer tem um valor, pois não é impressa. Eu também tentei wc -l , mas isso não funciona, apenas retorna 0 para mim.

Qual é a maneira correta de imprimir o número de pacotes não instalados?

EDIT: notei quando faço:

pacman -Q autoconf automake binutils bison fakeroot flex gcc libtool m4 make patch pkg-config > tempfile  
cat tempfile

As duas linhas contendo a mensagem de erro não são adicionadas ao tempfile (o restante da saída do comando faz). Pensei que isso poderia ajudar a resolver esse problema.

    
por Carlito 14.08.2012 / 18:31

3 respostas

4

O problema é que as mensagens de erro não são enviadas para STDOUT , mas STDERR . Você precisa redirecionar explicitamente STDERR , por exemplo:

pacman -Q bison patch pkg-config 2>&1 | grep -c 'error'

Se você tiver algo como bash ou zsh, poderá usar |& para redirecionar automaticamente STDOUT , bem como STDERR :

pacman -Q bison patch pkg-config |& grep -c 'error'
    
por 14.08.2012 / 20:01
1

Os erros são impressos em stderr , não em stdout . Seu canal ( | ) vê apenas a saída stdout . Você pode redirecionar stderr para stdout antes do pipe e, em seguida, toda a sua saída passará por grep :

pacman -Q autoconf automake binutils bison fakeroot flex gcc libtool m4 make patch pkg-config 2>&1 | grep -c 'error'

    
por 14.08.2012 / 20:03
-1

Você pode usar wc -l para contar o número de linhas geradas.

Então, se pacman -Q autoconf automake binutils bison fakeroot flex gcc libtool m4 make patch pkg-config | grep -c 'error' estiver exibindo:

error: package 'bison' was not found
error: package 'pkg-config' was not found

você pode executar pacman -Q autoconf automake binutils bison fakeroot flex gcc libtool m4 make patch pkg-config | grep -c 'error' | wc -l para contar o número de vezes que o grep emitiu uma linha.

    
por 14.08.2012 / 19:11