Bash: Como armazenar uma linha específica de saída CLI em um arquivo?

Bash: Como armazenar uma linha específica de saída CLI em um arquivo?
  1. Vamos supor que recebo a seguinte saída após executar um script bash na CLI (para que este texto seja exibido no terminal):

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

    Como posso armazenar o conteúdo de COOKIE(apenas o texto entre 'e ') em um arquivo separado?


  1. Além disso, o texto mencionado deverá ser colado neste arquivo externo em uma posição específica.

    O conteúdo do arquivo já existente é assim:

    [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
    

    Como isso é possível?

Responder1

Esses tipos de coisas não são de natureza genérica, mas específicos, embora a abordagem seja genérica


Estou assumindo que você deseja substituir OpenConnect.Cookie =line porOpenConnect.Cookie = BLABLABLABLABLA

Então, para primeiro criar a string necessária, você pode usar

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

Aqui estou usando a substituição de comando para criar primeiro a string necessária

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

e então substituindo a linha necessária por esta string necessária

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

Responder2

Você poderia usar:

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

Onde:

  • fileé o arquivo existente com o conteúdo descrito na pergunta.
  • commandé o seu comando que imprime o texto no terminal.
  • grep "^COOKIE="procura uma linha começando comCOOKIE=
  • e o ponto no início do comando "fonte" a saída. Isso significa que a saída é interpretada como código shell. Assim, a variável $COOKIEé definida no shell atual.
  • O sedcomando então substitui a linha no arquivo de destino pelo conteúdo da variável $COOKIE.

Responder3

Que tal

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

Ele cria um " sedarquivo de script" dinamicamente, extraindo/massageando os dados relevantes do seu comando CLI e executa esse arquivo de script usando "substituição de processo" em uma segunda sedchamada.

Responder4

Esta resposta é baseada em@MSalterscomentário de. O shell usado é o Bash.

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

Solução alternativa (usando GNU expr)

Esta solução funciona se houver apenas um resultado correspondente.

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

informação relacionada