Как объединить две команды в оболочке

Я имел обыкновение иметь эту команду, чтобы посчитать, сколько раз я щелкнул мышью, команда 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,
Другие вопросы по тегам