web-dev-qa-db-fra.com

Commande d'exécution Chaque fois que le regex est égalé, lisant de stdin qui n'a pas de EOF=

Je tente d'écrire un script Bash qui crée un horodatage (à écrire dans le fichier) chaque fois qu'une certaine chaîne se trouve dans la sortie de DBU-Monitor (paramètres spécifiés plus tard en poste). L'objectif principal de mon script est de sauvegarder le temps (y compris des millisecondes) et une date chaque fois qu'une chanson commence à jouer sur Spotify, car elle utilise des notifications.

La commande suivante sortira string "Spotify" Chaque fois que des êtres de chanson jouent.

dbus-monitor --session interface='org.freedesktop.Notifications',member='Notify' | grep 'string "Spotify"'

Ma tentative:

search='string "Spotify"'
found=$(dbus-monitor --session interface='org.freedesktop.Notifications',member='Notify' | grep 'string "Spotify"')

while [ ${search} == ${found} ]; do
    date -u +%Y%M%d-%H%M%S.%N >> timestamp.txt
done

Je suppose que la raison de ma dysfonction de mon code est que la DBU-Monitor fonctionne continuellement, empêchant ainsi la boucle tandis que de l'exécution.

6
user1929074

Cela devrait fonctionner:

stdbuf -oL dbus-monitor --session interface='org.freedesktop.Notifications',member='Notify' |
while grep -q 'string "Spotify"'; do
    date -u +%Y%M%d-%H%M%S.%N >> timestamp.txt
done

Modifier après @ Stéphanechazelas Commentaires:

stdbuf -oL dbus-monitor --session interface='org.freedesktop.Notifications',member='Notify' |
grep --line-buffered 'string "Spotify"' |
while read trash; do
    stdbuf -oL date -u +%Y%M%d-%H%M%S.%N >> timestamp.txt
done

+1 Autres réponses mais je garde cela pour la complétude

3
yarl

Dans ce cas, il ressemble à dbus-monitor fournit déjà des horodatages (dans les microsecondes de l'époque +). Donc, vous n'avez peut-être pas besoin d'exécuter date pour chaque match. Peut-être que l'expression correspondante peut réduire, par exemple, arg0='Spotify'.

Vérifiez la sortie de ceci:

dbus-monitor "
  type='method_call',
  interface='org.freedesktop.Notifications',
  member='Notify',
  arg0='Spotify'"

J'espère que vous ne verrez que des messages DBUS concernant des notifications de Spotify (incapable de tester cela - il suffit d'une suppression de la recherche de Spec DB ). Si cela fonctionne, les suivants peuvent être appropriés:

dbus-monitor --profile "type='method_call',
  interface='org.freedesktop.Notifications', member='Notify', arg0='Spotify'" |
gawk -F '\t' '
  $NF=="Notify" {
    secs = usecs = $2
    sub(/^[^.]+/,"",usecs)
    print strftime("%Y%m%d-%H%M%S",int(secs),"UTC") usecs
    fflush()
  }' > timestamp.log

Utilisant --profile Pour le format de sortie, car il semble plus simple d'analyser que la valeur par défaut --monitor sortir. Tuyauterie à GNU awk Pour extraire et formater l'horodatage.

2
rowboat