Bash: как сохранить определенную строку вывода CLI в файл?

Bash: как сохранить определенную строку вывода CLI в файл?
  1. Предположим, я получаю следующий вывод после выполнения скрипта bash в CLI (этот текст будет отображаться в терминале):

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

    Как сохранить содержимое COOKIE(только текст между 'и ') в отдельный файл?


  1. Кроме того, указанный текст необходимо вставить в этот внешний файл в определенное место.

    Содержимое уже существующего файла выглядит так:

    [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
    

    Как это возможно?

решение1

Эти типы вещей не являются общими по своей природе, а специфичными, хотя подход является общим.


Я предполагаю, что вы хотите заменить OpenConnect.Cookie =строку наOpenConnect.Cookie = BLABLABLABLABLA

Итак, чтобы сначала создать требуемую строку, вы можете использовать

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

Здесь я использую подстановку команд, чтобы сначала создать требуемую строку

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

и затем заменяем требуемую строку на эту требуемую строку

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

решение2

Вы можете использовать:

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

Где:

  • fileсуществующий файл с содержимым, описанным в вопросе.
  • commandэто ваша команда, которая выводит текст на терминал.
  • grep "^COOKIE="ищет строку, начинающуюся сCOOKIE=
  • и точка в начале команды "sources" вывод. Это означает, что вывод интерпретируется как шелл-код. Таким образом, переменная $COOKIEустанавливается в текущей оболочке.
  • Затем команда sedзаменяет строку в целевом файле содержимым переменной $COOKIE.

решение3

Как насчет

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

Он создает « sedфайл сценария» на лету, извлекая/обрабатывая соответствующие данные из вашей команды CLI, и выполняет этот файл сценария, используя «подстановку процесса» во втором sedвызове.

решение4

Этот ответ основан на@MSaltersКомментарий. Используемая оболочка — Bash.

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

Альтернативное решение (с использованием GNU expr)

Это решение работает, если есть только один совпадающий результат.

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

Связанный контент