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

7
  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. Darüber hinaus sollte der erwähnte 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?

Dave
quelle
Ich gehe davon aus, dass Sie das Skript erneut ausführen können, um die Ausgabe erneut zu erfassen. Mit anderen Worten, Sie versuchen nicht, den Bildschirm für diese bereits übergebene Ausgabe zu "kratzen"?
Jeff Schaller
@ JeffSchaller: Genau, ich kann das Skript so oft ausführen, wie ich möchte. Der Cookie ändert sich zwar jedes Mal, aber das spielt keine Rolle.
Dave

Antworten:

3

Diese Art von Dingen ist nicht generischer Natur, aber spezifisch, obwohl der Ansatz generisch ist


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

Um zuerst die erforderliche Zeichenfolge zu erstellen, können Sie diese 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 Befehlssubstitution, um zuerst die erforderliche Zeichenfolge zu erstellen

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

und dann Ersetzen der erforderlichen Zeile durch diese erforderliche Zeichenfolge

sed -i  "s/^OpenConnect.Cookie =.*$/output from above command substitution /" external_filename
mkmayank
quelle
2
GNU grep kann Lookbehind ausführen, wodurch Sie die verschachtelten speichern sed.
MSalters
Es ist ziemlich schwierig zu entscheiden, welche dieser großartigen Antworten die "Antwort" -Flagge verdient. Ich habe die Antwort mit den meisten positiven Stimmen gewählt - ich hoffe, das ist okay für Sie? Vielen Dank für Ihre Hilfe!!!
Dave
3

Sie können den Cookie mit einer Kombination aus Bashs Lesen und grep:

IFS="'" read -r _ cookie _ < <(some-command | grep '^COOKIE')

Dies verwendet die Prozessersetzung, um die Ausgabe von some-command | grep '^COOKIE')to zu speisen read. Mit IFS="='"teilen wir die Eingabe auf 'und verwerfen das erste Element von split ( COOKIE=) (und den verbleibenden Text nach dem schließenden Anführungszeichen), während wir das zweite in der cookieVariablen speichern .

Dann können wir sedden Text ersetzen:

sed -i 's/>>>INSERT CONTENT OF THE COOKIE HERE<<</'"$cookie"'/' some-file

Dies hängt jedoch davon ab, dass der Cookie-Text keine Sonderzeichen wie enthält &.

muru
quelle
1
Ich schlage vor, dass Sie read -r _ cookie _jeden Müll erfassen, der dem zweiten einfachen Anführungszeichen folgt.
Glenn Jackman
Es ist ziemlich schwierig zu entscheiden, welche dieser großartigen Antworten die "Antwort" -Flagge verdient. Ich habe die Antwort mit den meisten positiven Stimmen gewählt - ich hoffe, das ist okay für Sie? Vielen Dank für Ihre Hilfe!!!
Dave
2

Du könntest benutzen:

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

Wo:

  • file ist die vorhandene Datei mit dem in der Frage beschriebenen Inhalt.
  • command ist Ihr Befehl, der den Text auf dem Terminal druckt.
  • grep "^COOKIE=" sucht nach einer Zeile beginnend mit COOKIE=
  • und der Punkt am Anfang des Befehls "liefert" die Ausgabe. Dies bedeutet, dass die Ausgabe als Shell-Code interpretiert wird. Somit wird die Variable $COOKIEin der aktuellen Shell gesetzt.
  • Der sedBefehl ersetzt dann die Zeile in der Zieldatei durch den Inhalt der Variablen $COOKIE.
Chaos
quelle
Es ist ziemlich schwierig zu entscheiden, welche dieser großartigen Antworten die "Antwort" -Flagge verdient. Ich habe die Antwort mit den meisten positiven Stimmen gewählt - ich hoffe, das ist okay für Sie? Vielen Dank für Ihre Hilfe!!!
Dave
2

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 eine " sedSkriptdatei" im laufenden Betrieb, indem die relevanten Daten aus Ihrem CLI-Befehl extrahiert / massiert werden, und führt diese Skriptdatei mithilfe der "Prozessersetzung" in einem zweiten sedAufruf aus.

RudiC
quelle
Es ist ziemlich schwierig zu entscheiden, welche dieser großartigen Antworten die "Antwort" -Flagge verdient. Ich habe die Antwort mit den meisten positiven Stimmen gewählt - ich hoffe, das ist okay für Sie? Vielen Dank für Ihre Hilfe!!!
Dave
1

Diese Antwort basiert auf dem Kommentar von @MSalters . 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 übereinstimmendes 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
Fólkvangr
quelle
Es ist ziemlich schwierig zu entscheiden, welche dieser großartigen Antworten die "Antwort" -Flagge verdient. Ich habe die Antwort mit den meisten positiven Stimmen gewählt - ich hoffe, das ist okay für Sie? Vielen Dank für Ihre Hilfe!!!
Dave