URL: https://linuxfr.org/users/dramdur/journaux/taptempo-awk-une-approche-plus-unix Title: taptempo.awk : une approche plus unix ? Authors: barmic Date: 2018年03月05日T11:17:10+01:00 License: CC By-SA Tags: taptempo et awk Score: 43 Salut ! Ce journal s'inscrit dans la série des journaux traitant de portages de [taptempo](https://linuxfr.org/tags/taptempo/public). Pour bien commencer la semaine, je voulais proposer une alternative à taptempo sous forme de filtre. Ma version d'un compteur de tempo se base sur l'outil `xev` et ne possède aucune option. Il est plus rapide de modifier directement le script que d'en modifier. Pour moi c'est l'occasion de présenter `awk`, un langage de script relativement peu connu/utilisé alors qu'il est très intéressant. Il fait, pour moi parti de mon armement de base en shell avec bash/zsh, grep, sed et perl. Awk ? ===== awk est un outil en ligne de commande qui permet de parser du texte. Il représente le texte comme des lignes et des colonnes. Le langage est particulièrement fait pour filtrer et découper les lignes selon les critères que l'on souhaite. Par défaut les retours à la ligne découpent les lignes et les champs (les colonnes) sont découpés sur les espaces (les champs vides sont ignorés). Le code est organisé en bloc de code qui ont une condition devant eux. La condition peut être une expression régulière sur la ligne en cours de traitement, une condition "quelconque" (_est-ce que la variable foo est égale à 3 ?_), `BEGIN` ou `END`. Ces 2 dernier représentent le début et la fin du programme. On accède à la ligne via des variables : - `0ドル` représente toute la ligne - `1ドル`, `2ドル`,... le premier champ, le deuxième champ,... Attention les variables ne sont pas des copies de la ligne, mais une référence. Ça signifie que si j'affecte une valeur à `1ドル` alors `0ドル` en sera affecté. C'est plutôt pratique. Astuces ------- A fin d'être shell ready, il y a différentes choses qui sont disponibles de bases pour réduire la taille des scripts. - Les conditions sont optionnelles, un bloc sans condition sera toujours évalué ; - Les blocs sont optionnels : l’absence de bloc est équivalent à ``{print 0ドル}`` ; - Beaucoup de fonctions de traitements de chaines prennent par défaut `0ドル`. Du coup `print` est équivalent à `print 0ドル`. Dans la vie quotidienne ----------------------- Dans la vie, j'utilise `awk` en remplacement de `grep` + `sed` ou en remplacement de `cut` (j'aime pas bien cut). Par exemple : ```sh grep foo fichier | cut -f3 ``` sera remplacé par : ```sh awk '/foo/{print 3ドル}' fichier ``` Et ton taptempo, alors ? ======================== C'est pas vraiment un taptempo, c'est une alternative... Mais le voila : ```awk #!/usr/bin/awk -f BEGIN { size=15.; c=1; } /KeyPress event/{ k=1; } k == 1 && /^ root /{ sub(",", "", 6ドル); t[1+(c % size)]=6ドル; if(c> size){ start=1+c%size; end=1+(c-size+1)%size; interval=t[start]-t[end]; if(interval> 0) { print 60000/(interval/size), "BPM"; } else { print "Too speed"; } } c++; k=0; } ``` et il s'utilise via la ligne : ```sh xev -event keyboard | ./taptempo.awk ``` J'utilise le temps mesuré par xev plutôt que la fonction `systime()` d'awk pour avoir une précision à la miliseconde plutôt qu'à la seconde. Bonne semaine à tous ! Note: j'utilise `xev`, je ne connais que lui pour faire ça, mais peut être qu'il y en a d'autres plus pratiques