OVH имеет режим rescue boot / boot over network, вы можете исправить большинство файлов / каталогов, используя это, чтобы вернуть вас в исходное состояние в качестве временной меры...
(загрузитесь в режиме resucue, смонтируйте диск сервера в /mnt, затем перепишите все файлы обратно на root...)
в идеале вы хотите переустановить систему.
можно предложить настроить VM, даже если вы используете только одну VM, таким образом вы всегда сможете открыть консоль. Попробуйте ovirt...
Этот файл имеет синтаксис sh
. Итак, если этот файл действительно является файлом конфигурации, предназначенным для использования в сценариях sh
, просто выполните:
. ./environment-info.conf &&
printf '%s\n' "${docker_Name%%-*}" "$Build_Version" > "${docker_Name%%-*}_build.txt"
Вы ищете способ назвать файл с четырьмя буквами от имени докера. Этого можно добиться с помощью приведенной ниже команды, которая назначит четыре буквы переменной с именем 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
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]}
.
Нужно ли для этого использовать 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