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

OVH имеет режим rescue boot / boot over network, вы можете исправить большинство файлов / каталогов, используя это, чтобы вернуть вас в исходное состояние в качестве временной меры...

(загрузитесь в режиме resucue, смонтируйте диск сервера в /mnt, затем перепишите все файлы обратно на root...)

в идеале вы хотите переустановить систему.

можно предложить настроить VM, даже если вы используете только одну VM, таким образом вы всегда сможете открыть консоль. Попробуйте ovirt...

2
07.03.2016, 18:16
5 ответов

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

. ./environment-info.conf &&
  printf '%s\n' "${docker_Name%%-*}" "$Build_Version" > "${docker_Name%%-*}_build.txt"
1
27.01.2020, 22:11

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

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

Как упоминалось в ответах выше, команда присвоит docker_Name и build_version массиву с именем values:

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
0
27.01.2020, 22:11

1) чередуя ваши sed, чтобы а) удалить первую одиночную кавычку из docker_Name, б) удалить -pr-app-01' (включая последнюю одиночную кавычку), в) удалить часть =:

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

Где /match/s/pattern/replacement/ заменяет pattern на replacement в совпадающейстроке. Если замена является пустой строкой, она фактически удаляется. Обратите внимание, что я перешел от одинарных кавычек к двойным, чтобы справиться с одинарной кавычкой в вашей строке, и что вы можете использовать подстановочные знаки * . для поиска более сложных строк и объединять команды 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]}.

1
27.01.2020, 22:11

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

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

Использование 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
0
27.01.2020, 22:11

Теги

Похожие вопросы