Die Tatsache, dass es gibt, i++deutet darauf hin, dass entweder bashoder eine kshShell verwendet wurde, möglicherweise awkoder perlauch. In beiden Fällen können wir die Prozessersetzung verwenden <(...) , um die Ausgabe der xevZä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 printfSteuercode 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 -nindem 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?