Scipt Problem bzgl. Quoting (grep)

  • Hi,
    Ich habe einen einfachen grep-Ausdruck:


    grep 'Schalter 01 ' log.txt


    Nun möchte ich den Ausdruck in einer Skript anwenden wo
    in einer Schleife die Suchausdrücke bestimmt werden, d.h.


    S1="Schalter"
    S2="01"


    Die Variablen S1 und S2 beinhalten nun also den Suchausdruck
    (ist im Skript dynamisch, hier der Einfachheit wegen direkt gesetzt).


    Wie lautet nun die Zeile mit Befehlssubstitution `` ?



    Was z.B. nicht funktioniert:


    GREPCMD="grep \'$S1 $S2 \' log.txt"
    echo "Command for grep : " $GREPCMD
    RESULT=`$GREPCMD`



    Ich möchte mir die Zeile zunächst zusammenbauen, sie dann zur Kontrolle per echo ausgeben und schließlich
    per Befehlssubstitution `` ausführen.


    Was auch nicht funktioniert:


    GREPCMD='grep '"$S1" "$S2" ' log.txt'


    ergibt
    Schalter: command not found



    Ich hoffe es ist klar was ich meine.
    Wäre super wenn mir das jemand erklären könnte.


    Gruß
    Gromit

    Mein Glotz-o-fon-Konservierer im Aufbau:
    vdr-2.3.1, v4l Treiber, OpenSuse 42.1, Satelco Easywatch DVB-C

    2 Mal editiert, zuletzt von gromit ()

  • HI,


    übersichtlicher ist es wenn Du folgende Schreibweise verwendest:

    Code
    GREPCMD=$(grep '$S1 $S2' s**.Key)


    Sollte auch so funktionieren... Aber wozu steht sed in der Betreffzeile wenn Du grep hast?


    MfG
    Kris

    Intel DN2800MT 4GB RAM; 32GB mSata, Ubuntu 15.04, TVHeadend 4.1, Digibit R1 SatIP

  • Zitat

    Sollte auch so funktionieren... Aber wozu steht sed in der Betreffzeile wenn Du grep hast?


    Entschuldige die Verwirrung:
    Eigendlich habe ich das Problem bei folgendem sed Kommando bemerkt:


    Code
    SEDCMD="sed -i "s/`grep '"$S1" "$S2" ' log.txt | awk '{ print $3 }'`/`grep '"$S1" "$S2" ' logstatus.txt | awk '{ print $3 }'`/g" log.txt"



    Das Kommando findet per grep zwei Schlüsselbegriffe und nimmt das dritte Schlüsselwort dahinter und schreibt es in eine Statusdatei wo wieder die zwei ersten Schlüsselbegriffe gesucht werden und der dritte dann aktualisiert wird.


    Da das ganze etwas umfangreicher ist habe ich versucht das Problem zu vereinfachen und habe zunächst nur das grep Kommando hier aufgeführt. Werde ausprobieren ob es funktioniert...




    Gruß
    Gromit

    Mein Glotz-o-fon-Konservierer im Aufbau:
    vdr-2.3.1, v4l Treiber, OpenSuse 42.1, Satelco Easywatch DVB-C

    Einmal editiert, zuletzt von gromit ()

  • Zitat

    Originally posted by gromit
    Was z.B. nicht funktioniert:


    GREPCMD="grep \'$S1 $S2 \' log.txt"
    echo "Command for grep : " $GREPCMD
    RESULT=`$GREPCMD`


    Da verstrickst du dich in den Untiefen der shell quoting Regeln. Was hier ausgeführt wird, ist gleichbedeutend mit grep "\\'$1" "$2\\'" log.txt. Das RESULT=`$GREPCMD` zerlegt den Befehl erneut nach Leerzeichen, beachtet dabei aber " und ' nicht mehr. Setzt man $GREPCMD nochmal in "", wird dagegen alles zum Befehlsnamen zusammen gefasst. Abhelfen würde hier nur ein RESULT=`eval "$GREPCMD"`.


    SEHR viel einfacher machst du es dir so:


    echo "Command for grep: grep \"$1 $2 \" log.txt"
    RESULT=`grep "$1 $2 " log.txt`


    Zitat

    Was auch nicht funktioniert:


    GREPCMD='grep '"$S1" "$S2" ' log.txt'


    ergibt
    Schalter: command not found


    Zuweisungen erlauben nur einen Parameter. var=foo bar würde das Programm bar starten mit der lokalen Zuweisung var=foo. In diesem Fall wird "$S2" ' log.txt' gestartet mit der lokalen Zuweisung GREPCMD='grep '"$S1".


    Besser wäre z.B. GREPCMD="grep '$S1 $S2 ' log.txt" oder GREPCMD='grep "'$S1' '$S2' " log.txt' (keine Leerzeichen mehr außerhalb ' ').


    Gruß,


    Udo

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!