Bash: ¿Cómo almacenar una línea específica de salida CLI en un archivo?

Bash: ¿Cómo almacenar una línea específica de salida CLI en un archivo?
  1. Supongamos que recibo el siguiente resultado después de ejecutar un script bash en CLI (por lo que este texto se mostrará en la terminal):

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

    ¿Cómo puedo almacenar el contenido de COOKIE(solo el texto entre 'y ') en un archivo separado?


  1. Además, el texto mencionado debe pegarse en este archivo externo en una posición específica.

    El contenido del archivo ya existente se ve así:

    [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
    

    ¿Cómo es eso posible?

Respuesta1

Este tipo de cosas no son de naturaleza genérica, sino específicas, aunque el enfoque es genérico.


Supongo que quieres reemplazar OpenConnect.Cookie =la línea conOpenConnect.Cookie = BLABLABLABLABLA

Entonces, para crear primero la cadena requerida, puedes usar

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

Aquí estoy usando la sustitución de comandos para crear primero la cadena requerida

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

y luego sustituyendo la línea requerida por esta cadena requerida

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

Respuesta2

Podrías usar:

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

Dónde:

  • filees el archivo existente con el contenido descrito en la pregunta.
  • commandes su comando que imprime el texto en la terminal.
  • grep "^COOKIE="busca una línea que comience conCOOKIE=
  • y el punto al principio del comando "genera" la salida. Esto significa que la salida se interpreta como código de shell. Por lo tanto, la variable $COOKIEse establece en el shell actual.
  • Luego, el sedcomando reemplaza la línea en el archivo de destino con el contenido de la variable $COOKIE.

Respuesta3

Qué tal si

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

Crea un " sedarchivo de secuencia de comandos" sobre la marcha extrayendo/masajeando los datos relevantes de su comando CLI y ejecuta este archivo de secuencia de comandos utilizando "sustitución de procesos" en una segunda sedllamada.

Respuesta4

Esta respuesta se basa en@MSaltersEl comentario de. El shell utilizado es Bash.

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

Solución alternativa (usando GNU expr)

Esta solución funciona si solo hay un resultado coincidente.

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

información relacionada