Bash: Wie speichere ich eine bestimmte Zeile der CLI-Ausgabe in einer Datei?

Bash: Wie speichere ich eine bestimmte Zeile der CLI-Ausgabe in einer Datei?
  1. Nehmen wir an, ich erhalte die folgende Ausgabe, nachdem ich ein Bash-Skript in der CLI ausgeführt habe (dieser Text wird also im Terminal angezeigt):

    POST https://mycompany.com/
    COOKIE='BLABLABLABLABLA'
    HOST='ANYIPADDRESS'
    FINGERPRINT='sha256:BLABLABLABLA'
    

    Wie kann ich den Inhalt von COOKIE(nur den Text zwischen 'und ') in einer separaten Datei speichern?


  1. Des Weiteren soll der besagte Text an einer bestimmten Stelle in diese externe Datei eingefügt werden.

    Der bereits vorhandene Dateiinhalt sieht folgendermaßen aus:

    [global]
    Name = Name of VPN connection
    
    [provider_openconnect]
    Type = OpenConnect
    Name = Name of VPN connection
    Host = IP-address
    Domain = Domain name
    OpenConnect.Cookie = >>>INSERT CONTENT OF THE COOKIE HERE<<<
    OpenConnect.ServerCert = sha256:BLABLABLABLA
    

    Wie ist das möglich?

Antwort1

Diese Art von Dingen sind nicht allgemeiner Natur, aber spezifisch, obwohl der Ansatz allgemein ist


Ich gehe davon aus, dass Sie die Zeile ersetzen möchten OpenConnect.Cookie =durchOpenConnect.Cookie = BLABLABLABLABLA

Um also zuerst die erforderliche Zeichenfolge zu erstellen, können Sie verwenden

sed -i  "s/^OpenConnect.Cookie =.*$/$( command_giving_output  | grep 'COOKIE=' | sed "s/COOKIE='//; s/'//g; s/^/OpenConnect.Cookie = /")/" external_filename

Hier verwende ich die Befehlsersetzung, um zuerst die erforderliche Zeichenfolge zu erstellen

command_giving_output  | grep 'COOKIE=' | sed "s/COOKIE='//; s/'//g; s/^/OpenConnect.Cookie = /"

und dann die erforderliche Zeile durch diese erforderliche Zeichenfolge ersetzen

sed -i  "s/^OpenConnect.Cookie =.*$/output from above command substitution /" external_filename

Antwort2

Du könntest benutzen:

. <(command | grep "^COOKIE=")
sed -i "s/\(OpenConnect.Cookie\)\s*=.*/\1 = ""$COOKIE""/" file

Wo:

  • fileist die vorhandene Datei mit Inhalt wie in der Frage beschrieben.
  • commandist Ihr Befehl, der den Text auf dem Terminal druckt.
  • grep "^COOKIE="sucht nach einer Zeile, die beginnt mitCOOKIE=
  • und der Punkt am Anfang des Befehls "sourcet" die Ausgabe. Das bedeutet, dass die Ausgabe als Shell-Code interpretiert wird. Die Variable $COOKIEwird also in der aktuellen Shell gesetzt.
  • Der sedBefehl ersetzt dann die Zeile in der Zieldatei durch den Inhalt der Variablen $COOKIE.

Antwort3

Wie wäre es mit

sed -f <(CLI command | sed -n '/COOKIE=\o047/{s//\/OpenConnect.Cookie =\/ s\/= \.*$\/= /; s/.$/\//p;}') file
[global]
Name = Name of VPN connection

[provider_openconnect]
Type = OpenConnect
Name = Name of VPN connection
Host = IP-address
Domain = Domain name
OpenConnect.Cookie = BLABLABLABLABLA
OpenConnect.ServerCert = sha256:BLABLABLABLA

Es erstellt im laufenden Betrieb eine „ sedSkriptdatei“, indem es die relevanten Daten aus Ihrem CLI-Befehl extrahiert/bearbeitet, und führt diese Skriptdatei in einem zweiten sedAufruf mithilfe der „Prozesssubstitution“ aus.

Antwort4

Diese Antwort basiert auf@MSalter's Kommentar. Die verwendete Shell ist Bash.

prompt% COOKIE=$(./mycmd | grep -Po "(?<=COOKIE=)'[[:alnum:]]+'" | tr -d \')
prompt% echo "$COOKIE" >/tmp/cookie
prompt% sed -i "s:\(OpenConnect.Cookie =\).*:\1 $COOKIE:" file

Alternative Lösung (mit GNU expr)

Diese Lösung funktioniert, wenn nur ein passendes Ergebnis vorliegt.

prompt% COOKIE=$(expr "$(./mycmd | grep COOKIE)" : "COOKIE='\([[:alnum:]]\+\)'[[:space:]]*")
prompt% echo "$COOKIE" >/tmp/file
prompt% sed -i "s:\(OpenConnect.Cookie =\).*:\1 $COOKIE:" file

verwandte Informationen