Узнать, сколько программ я не установил из списка с помощью grep / awk в archlinux

Я хочу посмотреть, сколько пакетов из списка не установлено. Я использую archlinux, поэтому я использую pacman -Q, чтобы определить, установлен ли пакет. Если он не установлен, он возвращает сообщение типа: "error: package 'package-name" не найден ".

Я думал, что могу использовать grep -c 'error' следующим образом:

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

Но для меня это возвращается:

Ошибка: пакет «бизон» не найден
Ошибка: пакет '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}' 

Для меня это возвращает:

Ошибка: пакет «бизон» не найден
Ошибка: пакет 'pkg-config' не найден

Поэтому я предполагаю, что count переменных не имеет значения, так как оно не печатается. Я также пробовал wc -l , но это не работает, оно просто возвращает 0 для меня.

Каков правильный способ печати количества не установленных пакетов?

EDIT: Я заметил, когда я это делаю:

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

Две строки, содержащие сообщение об ошибке, не добавляются в tempfile (остальная часть вывода команды делает). Думал, что это поможет решить эту проблему.

Проблема заключается в том, что сообщения об ошибках не отправляются в 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' 

Ошибки печатаются на 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'

Вы можете использовать wc -l для подсчета количества выводимых строк.

Так что если pacman -Q autoconf automake binutils bison fakeroot flex gcc libtool m4 make patch pkg-config | grep -c 'error' 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 pacman -Q autoconf automake binutils bison fakeroot flex gcc libtool m4 make patch pkg-config | grep -c 'error' | wc -l pacman -Q autoconf automake binutils bison fakeroot flex gcc libtool m4 make patch pkg-config | grep -c 'error' | wc -l чтобы подсчитать количество раз, когда grep вывел строку.