7 votos

Cómo concatenar dos comandos en shell

Solía tener este comando para contar cuántas veces he hecho clic con el mouse, el comando es xev | grep "ButtonPress" .

mi colega modifica el comando para que vuelva:

 ButtonPress 0
ButtonPress 1
ButtonPress 2
ButtonPress 3
 

y así sucesivamente ... Desafortunadamente, ya no puede contactarse, así que ya no puedo contactarlo.

Recuerdo la participación de i++ y algo así, ¿cómo reproducir el comando?

11voto

Serg Puntos 17677

El hecho de que no hay i++ sugiere que no se bash o ksh shell en uso,potencialmente awk o perl como bueno. En cualquier caso, podemos utilizar la sustitución de procesos <(...) a la salida de dosificación de xev a contar de bucle (aunque simple canalización xev | while... puede funcionar muy bien).

procesamiento de texto:

Y portable para un menor número de pulsaciones de teclas que podemos utilizar awk :

$ xev | awk '/ButtonPress/{print "ButtonPress",i++}'
ButtonPress 0
ButtonPress 1
ButtonPress 2
ButtonPress 3

perl versión:

$ xev | perl -ne '/ButtonPress/ && printf("ButtonPress:%d\n",++$i)'
ButtonPress:1
ButtonPress:2
ButtonPress:3

Conchas:

He aquí lo que funciona 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

En caso de que no quieras spam de salida de muchas líneas, podemos usar printf a enviar el código de control para borrar la línea anterior y la salida de la cuenta corriente (que es que solo ver entero el cambio de valor en la línea):

$ i=0; while IFS= read -r line; do [[ $line =~ ButtonPress ]] && { ((i++)); printf "\r%b" "\033[2K"; printf 'ButtonPress: %d' "$i";} ;done < <(xev)

Portabilidad en 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

básica utils:

Simple, rápido, y de manera sucia podemos hack esta via cat -n con el número de líneas que se imprimen en la izquierda en lugar de a la derecha:

$ 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,

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: