Как объединить две команды в оболочке
Я имел обыкновение иметь эту команду, чтобы посчитать, сколько раз я щелкнул мышью, команда xev | grep "ButtonPress"
,
мой коллега изменил команду так, чтобы она вернулась:
ButtonPress 0
ButtonPress 1
ButtonPress 2
ButtonPress 3
и так далее... К сожалению, с ним больше нельзя связаться, поэтому я больше не могу с ним связаться.
Я вспоминаю причастность i++
и как то так, как воспроизвести команду?
1 ответ
Тот факт, что есть i++
предполагает, что был либо bash
или же ksh
оболочка в использовании, потенциально awk
или же perl
также. В любом случае мы можем использовать процесс подстановки <(...)
кормить продукцию из xev
к счетному циклу (хотя простой конвейер xev | while...
может работать просто отлично).
инструменты обработки текста:
Портативно и для меньшего количества нажатий клавиш мы можем использовать awk
:
$ xev | awk '/ButtonPress/{print "ButtonPress",i++}'
ButtonPress 0
ButtonPress 1
ButtonPress 2
ButtonPress 3
perl
версия:
$ xev | perl -ne '/ButtonPress/ && printf("ButtonPress:%d\n",++$i)'
ButtonPress:1
ButtonPress:2
ButtonPress:3
Снаряды:
Вот что работает в bash
:
$ i=0; while IFS= read -r line; do [[ $line =~ ButtonPress ]] && { ((i++)); printf 'ButtonPress: %d\n' "$i";} ;done < <(xev)
ButtonPress: 1
ButtonPress: 2
ButtonPress: 3
Если вам не нужен спам-вывод из многих строк, мы можем использовать printf
чтобы отправить управляющий код для очистки предыдущей строки и вывести только текущий счетчик (то есть вы увидите только изменение целочисленного значения в строке):
$ i=0; while IFS= read -r line; do [[ $line =~ ButtonPress ]] && { ((i++)); printf "\r%b" "\033[2K"; printf 'ButtonPress: %d' "$i";} ;done < <(xev)
Портативно в оболочке POSIX:
$ xev | ( i=0; while IFS= read -r l; do case "$l" in *ButtonPress*) i=$((i+1)) && printf 'ButtonPress:%d\n' "$i";; esac ;done)
ButtonPress:1
ButtonPress:2
ButtonPress:3
основные утилиты:
Для простого, быстрого и грязного способа мы можем взломать это через cat -n
с количеством строк, напечатанным слева вместо права:
$ xev | grep --line-buffered 'ButtonPress' | cat -n
1 ButtonPress event, serial 34, synthetic NO, window 0x4a00001,
2 ButtonPress event, serial 34, synthetic NO, window 0x4a00001,
3 ButtonPress event, serial 34, synthetic NO, window 0x4a00001,