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 

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

5 Solutions collect form web for “Bash: Как сохранить конкретную строку вывода CLI в файл?”

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


Я предполагаю, что вы хотите заменить строку 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 

Вы можете прочитать cookie, используя комбинацию read и grep :

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

Это использует подстановку процесса для подачи вывода команды some-command | grep '^COOKIE') some-command | grep '^COOKIE') read . При IFS="='" мы разделяем ввод на ' , отбрасывая первый элемент разбиения ( COOKIE= ) (и любой оставшийся текст после закрывающей кавычки), сохраняя второй в переменной cookie .

Затем мы можем использовать sed для замены текста:

 sed -i 's/>>>INSERT CONTENT OF THE COOKIE HERE< < 

Это зависит от того, что текст cookie не содержит специальных символов, таких как & , хотя.

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

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

Куда:

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

Как насчет

 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 .

Этот ответ основан на комментарии @MSalters . Используется shell 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 
Interesting Posts

Использовать-резервную сетевую оболочку (сеть приятно)

Есть ли способ иметь прошлые журналы в течение 1-2 лет в dpkg?

Сценарий оболочки не может создать файл awk

xbindkeys && xdotool => спонтанные отключения кнопок мыши

Изменено ли поведение функции экспорта в bash?

Цветовые коды для echo не работают при запуске скрипта через ssh

Выполнить SSH удаленного cmd exec на нескольких локальных серверах с ввода (sshpass?)

Linux GUI для отслеживания соединений, сделанных с / на этом компьютере

удалите столбец массива разной длины

Нужна помощь в понимании того, что означают «каналы», «buffer_size», «period_size», «привязки» и «ipc_key» в .asoundrc

Возможности варианта Linux Heartbeat

Депозитные инструменты Chromium не будут работать

Как изменить фон в isolinux

Бесконечное журналирование ошибок при голосовании: не удалось установить блокировку автозапуска

Как изменить цвет шрифта / фона в прозрачных окнах?

Linux и Unix - лучшая ОС в мире.