Shell-Ausgabe nach "wort" durchsuchen

  • Hallo geehrtes Forum!


    Bin leider noch absuluter Linux Neuling und komm bei folgendem Versuch nicht weiter:



    Mit folgendem Befehl kann ich den Status von meiner Squeezebox per Terminal abrufen:


    pylms -s 10.0.0.14 -i


    Ausgabe sieht dann so aus:


    INFO: Server Version: 7.7.2
    INFO: Player: 11:22:33:44:55:66 | SqueezeLite 2 | V: 59 | M: stop | T: 0.0 | C: True | W: 0
    INFO: Player: 22:33:44:55:66:77 | SqueezeLite | V: 50 | M: play | T: 168.608638279 | C: True | W: 0
    WARNING: No arguments provided




    Nun möchte ich dies per sh Skript ausführen um einen Gpio zu steuern: (ich versuchs mal zu erklären :-D)



    player mac: 11:22:33:44:55:66


    if "pylms -s 10.0.0.14 -i" (nur die zeile in der die oben definierte mac vorkommt auf "play" durchsuchen)
    then
    "befehl1"
    else
    "befahl2"
    fi


    Befehle zur Gpio Steuerung sind mir bekannnt, geht mir rein um das prüfen des strings.
    Hab im Web einiges über "grep" gefunden, aber leider bekomm ichs nicht hin^^



    Hoffe jemand kann mir helfen! :)


    Danke! Hannes

    • Official Post

    Hallo Hannes,


    ich habe eine ähnliche abfrage mit MPC gehabt.
    Versuch mal folgendes:


    Code
    audio=`pylms -s 10.0.0.14 -i`
    
    
    if [[ $audio =~ .*play* ]]
    then
       #Dein Befehl 1
    else
       #Dein Befehl 2
    fi



    Gruß trek_star

  • Ist nen Standard Regex.. weiss nicht wie das unterstützt wird.


    Code
    if [[ $audio =~ ^.*11:22:33:44:55:66.*play.*$ ]]
  • ich würde es so machen:


    Keep it simple [,&] stupid

  • Danke für die raschen Antworten!


    Hab mir jetzt folgendes zusammengebastetl:



    Shairport und MPD schlten auch brav, aber wenn ich per Squeezelite was spiele tut sich nix.
    Die ausgabe von pylms funktioniert, also muss im Code noch was falsch sein...


    Hoffe jemand kann kurz drüberschaun! :)


    danke!!

  • ich habe kein pylms, kann nicht testen


    Wie sieht die Ausgabe aus (ohne -q)?


    Code
    pylms -s $SQUEEZE -i | grep $MAC
    
    
    pylms -s $SQUEEZE -i | grep $MAC | grep play

    Keep it simple [,&] stupid

  • wie kann ich mir die Ausgabe anzeigen lassen?
    oder einfach ins teminal


    pylms -s 10.0.0.14 -i | grep 11:22:33:44:55:66


    schreiben?


    da bekomm ich die selbe ausgabe wie ohne dem grep teil, also alle player (siehe 1.post)

  • im terminal ist schon richtig.



    Aber wieso alle Player??


    Es sollte eigentlich nur eine Zeile sein.
    Also etwa so


    INFO: Player: 11:22:33:44:55:66 | SqueezeLite 2 | V: 59 | M: stop | T: 0.0 | C: True | W: 0


    wenn 11:22:33:44:55:66 der gesuchte MAC ist.

    Keep it simple [,&] stupid

  • hm, eigenartig^^


    gibt immer alle Zeilen ungefiltert aus... auch wenn ich das ganze skript starte seh ich ca. jede Sek.
    alles Zeilen im Terminal.


    Kenn mich leider mit grep überhaupt nicht aus.



    Danke!
    [hr]
    Auch so funktionierts leider nicht...



    audio=`pylms -s 10.0.0.14 -i`


    if [[ $audio =~ ^.*11:22:33:44:55:66.*play.*$ ]]
    then
    SQUEEZELITE_STATE=1


    else
    SQUEEZELITE_STATE=0
    fi

  • man kann mit grep zwar komplizierte Sachen machen. Aber das Grundsätzliche ist ganz einfach.
    Es werden halt Zeilen mit dem Suchstring herausgefiltert und nur diese angezeigt.


    teste mal:


    Code
    IFS='
    '
    pylms -s 10.0.0.14 -i | grep 11:22:33:44:55:66



    Hinter IFS=' darf nichts stehen, auch kein Leerzeichen!

    Keep it simple [,&] stupid


  • Gibt auch alles aus, wie im 1. post^^


    Gefühlt hab ich schon alles versucht, aber kein hauch von erflog...


    Kann das ganze jemand auf anderem Weg lösen? (SED??)


    danke nochmal! :)

  • awk ist eher weiteres Programm, dass du nehmen kannst.
    Aber awk reicht für eine ganze Semestervorlesung



    edit:


    erst jetzt gesehen


    Die beiden Zeilen mit IFS müssen genauso stehen wie in meinem Beispiel: OHNE Einrückung

    Keep it simple [,&] stupid

    Edited once, last by kungel ().

  • nochmal ohne einrücken.... nichts^^


    Warum sehe ich die ausgabe von pylms überhaupt im Terminal wenn ich das Skript starte?
    Muss ich diese ausgabe nicht noch in Skript umleiten?

  • na ja, in das Script umleiten wäre schlecht. Dann hättest du beim nächsten Aufrufen des Scripts tausend Fehlermeldungen.


    Aber eigentlich ist es durch die Pipe ("|") schon umgeleitet. Warum die Ausgabe trotzdem noch erfolgt, kann ich dir nicht sagen.
    Gibt es für das Programm Parameter um die Ausgabe zu steuern?


    Ansonsten kann man mit >/dev/null alles ins Nirwana schicken.


    Oder mit >/pfad/dateiname alles in eine Datei schreiben und dann


    echo /pfad/dateiname | grep ...


    ausprobieren.


    Für heute abend Tschüß

    Keep it simple [,&] stupid

  • So, ein Freund von mir konnte mir weiterhelfen! :)


    Die Ausgabe von pylms konnten wir leider auch weiterhin nicht verwerten (auch nicht in eine .txt weiterleiten, daher lassen wir pylms nun
    die log in eine .txt schreiben weche wir dann per grep filtern.



    Danke an alle für die Mühe!


    Hannes

  • Das:

    Code
    cat /root/squeeze.txt | grep "$MAC" | grep -c "play"


    Kannst du effektiver so nutzen:

    Code
    grep "$MAC" /root/squeeze.txt | grep -c play



    Und als Tip nebenbei: Vermeide so gut es geht Anführungszeichen oben ( " " ) da bash sonst darin nach einer Variable sucht


    Code
    IFS='
    '


    Ist ebenfalls falsch, das soll vermutlich ein 'newline' bewirken? Dann wäre es: IFS=$'\n'


    Ich kenn zwar pylms nicht aber verstehe nicht wofür das Script dienen soll?


    Und:


    if [ $? -eq 0 ]


    prüft zudem ob der Rückgabewert des vorherigen Befehls einen höheren Rückgabewert als 1 hat, was aber eigentlich zum Abfragen von Errors genutzt wird (exit code > 0) ... Dh. " if [ $? -eq 0 ] " trifft zu wenn der vorherige Befehl erfolgreich ausgeführt wurde

  • Die beiden Zeilen mit IFS bedeuten newline, kann man auch anders, ist aber piep-egal wie man es schreibt.



    grep liefert einen Fehler zurück, wenn nichts gefunden wird.
    Einfach mal ausprobieren!


    Also nichts falsch. also bei mir

    Keep it simple [,&] stupid

  • wer redet denn hier von "grep -c"?


    testen must du


    grep blabla /var/log/messages
    echo $?

    Keep it simple [,&] stupid

    Edited once, last by kungel ().


  • ...Und als Tip nebenbei: Vermeide so gut es geht Anführungszeichen oben ( " " ) da bash sonst darin nach einer Variable sucht...


    Diese Aussage verwundert mich sehr. Was meinst Du damit genau? Good practice für bash ist alle benutzen Variablen in Tests in " einzurahmen um die leidige LeerzeichenSyntaxErrorProblematik zu umgehen.

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert :fies: Bei mir tut das raspiBackup automatisch :shy: