Le fait qu'il y ait i++
suggère qu'il y a eu soit bash
o ksh
Shell en cours d'utilisation, potentiellement awk
o perl
également. Dans les deux cas, nous pouvons utiliser substitution de processus <(...)
pour alimenter la sortie de xev
à la boucle de comptage (bien qu'un simple pipeline xev | while...
pourrait très bien fonctionner).
outils de traitement de texte :
De manière portable et avec moins de frappes, nous pouvons utiliser awk
:
$ xev | awk '/ButtonPress/{print "ButtonPress",i++}'
ButtonPress 0
ButtonPress 1
ButtonPress 2
ButtonPress 3
perl
version :
$ xev | perl -ne '/ButtonPress/ && printf("ButtonPress:%d\n",++$i)'
ButtonPress:1
ButtonPress:2
ButtonPress:3
Coquilles :
Voici ce qui fonctionne en 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
Si vous ne voulez pas d'un résultat spammy de plusieurs lignes, nous pouvons utiliser printf
pour envoyer un code de contrôle afin d'effacer la ligne précédente et de n'afficher que le décompte en cours (c'est-à-dire que vous ne verrez que les changements de valeurs entières sur la ligne) :
$ i=0; while IFS= read -r line; do [[ $line =~ ButtonPress ]] && { ((i++)); printf "\r%b" "\033[2K"; printf 'ButtonPress: %d' "$i";} ;done < <(xev)
Portable dans POSIX Shell :
$ 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
outils de base :
Pour une méthode simple, rapide et sale, nous pouvons pirater ceci via cat -n
le nombre de lignes étant imprimé à gauche et non à droite :
$ 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,