GNU/Linux >> Tutoriels Linux >  >> Linux

Grep est-il lent à sortir après avoir trouvé une correspondance ?

J'essaie d'écrire un script bash qui interroge btmon pour les connexions de périphériques. J'ai une solution de travail, mais c'est absurdement lent, et il semble que le problème est que grep est très lent à sortir après avoir trouvé une correspondance (environ 25 secondes). Que puis-je faire pour accélérer grep ou éviter de l'utiliser ?

#!/bin/bash
COUNTER=0
while :
  do
    until btmon | grep -m 1 '@ Device Connected'
      do :
    done
    let COUNTER=COUNTER+1
    echo on 0 | cec-client RPI -s -d 1
    sleep 5
    echo as | cec-client RPI -s -d 1
    until btmon | grep -m 1 '@ Device Disconnected'
      do :
    done
    let COUNTER=COUNTER-1
    if [ $COUNTER -eq 0 ];
      then echo standby 0 | cec-client RPI -s -d 1;
    fi
done

edit :pour clarifier, btmon et est un outil de surveillance Bluetooth qui fait partie de la suite Bluez, et cec-client est un utilitaire fourni avec libCEC pour émettre des commandes sur le bus série HDMI-CEC (entre autres).

Réponse acceptée :

Dans :

cmd1 | cmd2

La plupart des shells (le shell Bourne, (t)csh, ainsi que yash et certaines versions d'AT&T ksh sous certaines conditions étant les exceptions notables) attendent à la fois cmd1 et cmd2 .

Dans bash , vous remarquerez que

sleep 1 | uname

revient après une seconde.

Dans :

btmon | grep -m 1 '@ Device Disconnected'

grep sortira dès qu'il aura trouvé une occurrence du motif, mais bash attendra toujours btmon .

btmon mourra généralement d'un SIGPIPE la prochaine fois qu'il écrira dans le tube après grep est revenu, mais s'il n'écrit plus jamais rien, il ne recevra jamais ce signal.

Vous pouvez remplacer #! /bin/bash avec #! /bin/ksh93 car c'est un shell compatible avec bash et un qui n'attend que le dernier composant d'un pipeline. Puis dans

btmon | grep -m 1 '@ Device Disconnected'

après grep renvoie, btmon serait laissé en arrière-plan et le shell continuerait avec le reste du script.

Si vous vouliez tuer btmon dès que grep renvoie, POSIXly, vous pouvez faire quelque chose comme :

sh -c 'echo "$$"; exec btmon' | (
   read pid
   grep -m1 '@ Device Disconnected' || exit
   kill "$pid" 2> /dev/null
   true)

Linux
  1. Comment exécuter Grep avec plusieurs et modèles ?

  2. Imprimer la ligne précédente après une correspondance de modèle à l'aide de Sed ?

  3. Trouver le dernier élément d'une ligne à l'aide de Grep ?

  4. Comment compter le nombre de lignes dans un fichier après une correspondance Grep ?

  5. Préserver la coloration après avoir passepoilé grep à grep

Recherche du nombre de processus sous Linux via la ligne de commande

Faites correspondre deux chaînes sur une ligne avec grep

Recherche de fichiers exécutables à l'aide de ls et grep

Comment grep pour le contenu après le modèle?

Linux sudo fonctionne lentement après avoir changé le nom d'hôte

Comment conserver le conteneur docker alpin après l'utilisation de la sortie ?