Die Tatsache, dass es gibt, i++
deutet darauf hin, dass entweder bash
oder eine ksh
Shell verwendet wurde, möglicherweise awk
oder perl
auch. In beiden Fällen können wir die Prozessersetzung verwenden <(...)
, um die Ausgabe der xev
Zählschleife zuzuführen (obwohl eine einfache Pipeline xev | while...
problemlos funktionieren könnte).
Textverarbeitungswerkzeuge :
Portabel und für weniger Tastenanschläge können wir verwenden awk
:
$ xev | awk '/ButtonPress/{print "ButtonPress",i++}'
ButtonPress 0
ButtonPress 1
ButtonPress 2
ButtonPress 3
perl
Ausführung:
$ xev | perl -ne '/ButtonPress/ && printf("ButtonPress:%d\n",++$i)'
ButtonPress:1
ButtonPress:2
ButtonPress:3
Muscheln :
Folgendes funktioniert in 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
Falls Sie nicht möchten, dass viele Zeilen spammig ausgegeben werden, können Sie printf
Steuercode senden, um die vorherige Zeile zu löschen und nur die laufende Anzahl auszugeben (dh, Sie sehen nur eine Änderung des ganzzahligen Werts in der Zeile):
$ i=0; while IFS= read -r line; do [[ $line =~ ButtonPress ]] && { ((i++)); printf "\r%b" "\033[2K"; printf 'ButtonPress: %d' "$i";} ;done < <(xev)
Portabel in der 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
Grundausstattung :
Auf einfache, schnelle und schmutzige Weise können wir dies hacken, cat -n
indem die Zeilenanzahl links statt rechts gedruckt wird:
$ 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,
xev | grep -c "ButtonPress"
, die Anzahl der Klicks beim Beenden anzeigen?