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

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

Значения, которые я пытаюсь извлечь, это «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 
  • Как взять список и удалить его из файла?
  • Лучше, чем `tee | разрезать | ... | paste`
  • Поиск файлов, содержащих несколько ключевых слов в любом месте файла
  • Полосы пробелов после одиночных заглавных букв с sed
  • Почему xargs вырезает цитаты из ввода?
  • Как заменить этот шаблон на новую строку внутри?
  • Обмен одной колонки из файла1 с файлами из файла2
  • условная окраска в grep
  • Сценарий Bash для извлечения некоторой информации из HTML-страниц Ebay
  • Использование sed для цветного вывода из команды на Solaris
  • Фильтрация или обтекание определенных разделов файла
  • Linux и Unix - лучшая ОС в мире.