Как извлечь данные из файла и построить имя файла из одного из значений

Я пытаюсь извлечь два значения из файла конфигурации и записать их в новый файл. Жесткая часть заключается в том, что я хочу, чтобы имя нового файла определялось одним из значений во входном файле.

Значения, которые я пытаюсь извлечь, это «Build_Version» и четырехбуквенное сокращение от имени Docker («docker_Name»). Например, если файл говорит docker_Name='bcbs_pr-app-01' , я хочу только «bcbs». И я хочу записать их в файл с именем сборки, например, bcbs_build.txt .

Вот выдержка из файла журнала:

 nonSSL_port=80 # FOR STAGING Build_Type=prod Build_Version=9.0.00.01_134143 docker_Name='bcbs-pr-app-01' 

Требуемый вывод файла

 bcbs 9.0.00.01_134143 

Я придумал команду sed которая работала для того, чтобы вытащить ценности, которые я хотел

 sed -n -e '/Build_Version=/p' -e '/docker_Name=/p' environment-info.conf > build_version.txt 

но он извлекает Build_Version= и docker_Name= целиком, и я хочу только значения имени Build_Version и docker. И мне еще нужно выяснить, как назвать файл с четырехбуквенным сокращением имени Docker (bcbs).

5 Solutions collect form web for “Как извлечь данные из файла и построить имя файла из одного из значений”

Этот файл выглядит как синтаксис sh . Итак, если этот файл действительно представляет собой файл конфигурации, предназначенный для работы в сценариях sh , просто выполните:

 . ./environment-info.conf && printf '%s\n' "${docker_Name%%-*}" "$Build_Version" > "${docker_Name%%-*}_build.txt" 

1) чередуя ваш sed , a) удалите первую одинарную цитату docker_Name , b) удалите -pr-app-01' (включая последнюю одинарную цитату), c) удалите <value>= part:

  sed -n "/Build_Version=/s/.*=//p;/docker_Name=/s/.*=//;s/'//;s/-.*//p" 

Где /match/s/pattern/replacement/ заменяет pattern с replacement в строке соответствия. Если replacement является пустой строкой, она эффективно удаляется. Обратите внимание, что я переключился с одиночного на двойные кавычки, чтобы обрабатывать одиночную кавычку в вашей строке, и что вы можете использовать подстановочные знаки * . чтобы сопоставить более сложные строки и объединить команды sed с sed с запятой.

2) Мы читаем в двух результатах как массив BASH :

 values=( $( sed -n "/Build_Version=/s/.*=//p;/docker_Name=/s/.*=//;s/'//;s/-.*//p" file ) ) 

Где array=( value1 value2 value3 ) и $(do this command)

3) Мы используем массив для наших целей, обратите внимание, что счетчик начинается с 0 :

 echo ${values[1]} > ${values[1]} echo ${values[0]} >> ${values[1]} 

Где мы адресуем запись массива через имя массива и intex записи ${array[intex]} .

Вам нужно использовать sed для этого? grep и perl могут делать то, что вам нужно.

 grep 'Build_Type\|docker_Name' environment-info.conf | perl -pe "s|docker_Name='(.*?)-.*|docker_Name=\1|" > build_version.txt 

Использование GNU sed :

 sed -nr "s/^Build_Version=([^=]+)$/\1/p; s/^docker_Name='([^-]+).*/\1/p" file.txt 

Мы используем группы захвата для получения желаемых частей из соответствующих строк. Он состоит из двух частей:

  • s/^Build_Version=([^=]+)$/\1/ получает нас 9.0.00.01_134143

  • s/^docker_Name='([^-]+).*/\1/ получает нас bcbs

Чтобы сохранить вывод в build_version.txt :

 sed -nr "s/^Build_Version=([^=]+)$/\1/p; s/^docker_Name='([^-]+).*/\1/p" \ file.txt >build_version.txt 

Пример:

 % cat file.txt nonSSL_port=80 # FOR STAGING Build_Type=prod Build_Version=9.0.00.01_134143 docker_Name='bcbs-pr-app-01' % sed -nr "s/^Build_Version=([^=]+)$/\1/p; s/^docker_Name='([^-]+).*/\1/p" file.txt 9.0.00.01_134143 bcbs 

Вы ищете способ назвать файл четырьмя буквами из имени докеры. Это может быть достигнуто с помощью команды ниже, которая присваивает четыре буквы переменной, называемой File_Name.

 File_Name=`cat file | grep "docker_Name" | awk -F"'" '{print $2}' | awk -F'-' '{print $1}'` 

Как уже упоминалось в приведенных ниже ответах команда присваивает имя docker_Name и build_version массиву со значениями:

 values=($(sed -n "/docker_Name=/s/.*=//;s/'//;s/-.*//p;/Build_Version=/s/.*=//p" file)) 

Мы обращаемся к массиву в обратном порядке, чтобы захватить вывод так, как вы хотите:

 for i in 1 0; do echo ${values[$i]} >> $File_Name.txt; done 

Файл будет готов с нужным именем, а cat отобразит его содержимое:

 % cat bcbs.txt bcbs 9.0.00.01_134143 
  • Свернуть несколько повторяющихся частей последовательных строк
  • замените с начала строки на 1 из нескольких шаблонов в конец другой строки со вторым шаблоном
  • Получите первое соответствие шаблону в строке, не использующей разрез
  • Сокращение порядка и вывод текста
  • Как пропустить файл в sed, если он содержит регулярное выражение?
  • Как извлечь строку между двумя шаблонами с помощью sed в Linux, а второй шаблон повторяет больше строк в файле
  • Как заменить этот шаблон на новую строку внутри?
  • Заменить между шаблонами, которые начинаются и заканчиваются в разных строках
  • Как я могу извлечь числа в файле с помощью sed или любого другого инструмента?
  • Анализ файлов журнала с помощью sed -e. Нужно учитывать уникальные имена классов
  • Получить строку запроса из URL-адресов в файле журнала
  • Interesting Posts

    tar удалить заданный вопрос

    Сценарий Bash для минимизации PNG продолжает останавливаться

    Сортировка больших файлов дает ошибку сегментации

    Средние все строки из нескольких столбцов с тем же первым столбцом

    Перевести с IPv4 на IPv6 и обратно

    Запретить пакет resolvconf назначать localhost, если named host9 / dnsmasq находится на хосте

    Скрипт для временного удаления прав администратора

    буфер обмена не работает при подключении через rdesktop к xrdp-sesman

    Что такое хороший баланс между надежным паролем sudo и длительной задержкой

    Две команды GNU Parallel, выполненные на одном компьютере

    Shell Hangs после запуска cd, ls, vim over ssh

    Нужно ли мне удалять все «java | jre» пакеты из моей системы, чтобы быть уверенным в уязвимости java?

    Служба mysql выходит без ошибок

    Btrfs + LXC: каким-либо образом показать даже приблизительное приблизительное свободное пространство для контейнера LXC с кавычками?

    Почему проверка SHA256 контрольной суммы с `sha256sum` терпит неудачу на Debian и работает на Ubuntu?

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