Как конкатенировать два, управляют в оболочке

Я раньше имел эту команду для подсчета, сколько раз у меня есть щелчок с мышью, команда xev | grep "ButtonPress".

мой коллега изменяет команду так, чтобы она возвратилась:

ButtonPress 0
ButtonPress 1
ButtonPress 2
ButtonPress 3

и так далее... К сожалению, он больше не contactable, таким образом, я не могу больше достигать его.

Я вспоминаю участие i++ и что-то как этот, как воспроизвести команду?

7
задан 7 March 2019 в 02:33

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

основной utils:

Для простого, быстрого, и грязного пути мы можем взломать это через 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,
11
ответ дан 23 November 2019 в 06:23

Другие вопросы по тегам:

Похожие вопросы: