7 votes

Comment concaténer deux commandes dans Shell ?

J'avais l'habitude d'avoir cette commande pour compter combien de fois j'ai cliqué avec une souris, la commande est la suivante xev | grep "ButtonPress" .

mon collègue modifie la commande pour qu'elle revienne :

ButtonPress 0
ButtonPress 1
ButtonPress 2
ButtonPress 3

et ainsi de suite... Malheureusement, il n'est plus joignable et je ne peux donc plus le contacter.

Je me souviens de la participation de i++ et quelque chose comme ça, comment reproduire la commande ?

11voto

Sergiy Kolodyazhnyy Points 97292

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,

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X