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

7
  1. Vamos supor que recebo a seguinte saída após a execução de 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 (somente o texto entre ' e ' ) em um arquivo separado?

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

    O conteúdo do arquivo já existente se parece com isso:

    [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?

por Dave 27.08.2018 / 12:10

5 respostas

3

Esses tipos de coisa não são genéricos por natureza, mas a abordagem específica é genérica

Suponho que você queira substituir OpenConnect.Cookie = line por OpenConnect.Cookie = BLABLABLABLABLA

Portanto, para criar primeiro uma string obrigató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 primeiro criar a string necessária

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

e, em seguida, substituindo a linha exigida por essa string obrigatória

sed -i  "s/^OpenConnect.Cookie =.*$/output from above command substitution /" external_filename
    
por 27.08.2018 / 12:38
3

Você pode ler o cookie usando uma combinação de leitura do bash e grep :

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

Isso usa a substituição de processo para alimentar a saída de some-command | grep '^COOKIE') to read . Com IFS="='" , dividimos a entrada em ' , descartando o primeiro elemento da divisão ( COOKIE= ) (e qualquer texto restante após a cotação de fechamento), enquanto salvamos o segundo na variável cookie .

Em seguida, podemos usar sed para substituir o texto:

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

Isso depende do texto do cookie que não contém caracteres especiais como & .

    
por 27.08.2018 / 12:37
2

Você pode usar:

. <(command | grep "^COOKIE=")
sed -i "s/\(OpenConnect.Cookie\)\s*=.*/ = ""$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 por uma linha que começa com COOKIE=
  • e o ponto no início do comando "origina" a saída. Isso significa que a saída é interpretada como código shell. Assim, a variável $COOKIE é definida no shell atual.
  • O comando sed substitui a linha no arquivo de destino pelo conteúdo da variável $COOKIE .
por 27.08.2018 / 12:53
2

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 "arquivo de script sed " on the fly extraindo / massageando os dados relevantes do seu comando CLI e executa esse arquivo de script usando "substituição de processo" em uma segunda chamada sed .

    
por 27.08.2018 / 13:55
1

Esta resposta é baseada no comentário de @MSalters . 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 =\).*: $COOKIE:" file

Solução alternativa (usando o 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 =\).*: $COOKIE:" file
    
por 28.08.2018 / 08:25