Кто-нибудь знает изящный трюк для редактирования текстового файла без vim, emacs или nano, просто используя BaSH?

#bash #docker

#bash #docker

Вопрос:

Для контекста я пытаюсь создать образ docker для базы данных MySQL, в которую я могу войти без использования пароля. Я читаю статью о том, как это сделать, но для этого мне нужно обновить my.cnf в контейнере с учетными данными, которые мне нужны, чтобы избежать необходимости ввода пароля.

Одна из моих идей заключалась в том, чтобы получить шаблонную версию файла my.cnf, поместить его в обычный текстовый файл, обновить его с помощью необходимых мне учетных данных и скопировать его в контейнер. Но я все еще не знаю достаточно команд BASH, чтобы брать текст из одного файла и перезаписывать другой. Я открыт даже для простых указаний на то, как я мог бы сделать это с помощью команд ванильной оболочки. Надеюсь, это может помочь кому-то еще опубликовать этот вопрос.

Вот что изначально нравится локальным пользователям my.cnf

 [mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
  

Мне нужно обновить его, чтобы иметь что-то вроде этого. В этом фрагменте есть строки пользователя и пароля.

 [mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[MySQL]
user=root
password=supersecret
  

Комментарии:

1. Вы просите рассказать о существовании sed или awk ?

2. Я думаю, да. Я посмотрю, что делают эти команды

3. Если кто-то не опередит меня. Я опубликую хороший ответ для следующего пользователя. Спасибо за указатель @jeremysprofile

4. Или… Вы просите рассказать о существовании документов Here ?

5. ed очень удобно для редактирования файлов в сценариях оболочки.

Ответ №1:

Поскольку изменения, которые вы хотите внести, просто состоят из добавления в конец файла, вы можете использовать перенаправление вывода с >> для добавления в файл. Любое из следующих действий должно работать. Вот пример использования оболочки «here-document»:

 cat >>.my.cnf <<'EOF'
[MySQL]
user=root
password=supersecret
EOF
  

Или вы могли бы использовать три отдельных echo s:

 echo '[MySQL]' >>.my.cnf
echo 'user=root' >>.my.cnf
echo 'password=supersecret' >>.my.cnf
  

Или один printf :

 printf '%sn' '[MySQL]' 'user=root' 'password=supersecret' >>.my.cnf
  

Обратите внимание, что если ваш пароль содержит одинарную кавычку, ему потребуется несколько более сложная обработка в echo printf случаях или (потому что вы не можете включить одинарную кавычку в строку, заключенную в одинарные кавычки).

Ответ №2:

Находясь в соответствующем каталоге, я могу запустить это.

 awk '1; END {print "[mysql]"}' .my.cnf > tmp amp;amp; mv tmp .my.cnf amp;amp; awk '1; END {print "user=root"}' .my.cnf > tmp amp;amp; mv tmp .my.cnf amp;amp; awk '1; END {print "password=supersecret"}' .my.cnf > tmp amp;amp; mv tmp .my.cnf
  

Это был отличный ресурс, чтобы узнать, как это работает https://www.cyberciti.biz/faq/bash-scripting-using-awk /

Вот основная схема

 awk '1; END {print "text to add"}' file > tmp amp;amp; mv tmp file
  

для любого файла, который вы укажете, он добавит текст для добавления в нижнюю часть

Комментарии:

1. если вы просто хотите добавить 3 строки в конец файла (согласно последнему редактированию вопроса): printf "[mysql]nuser=rootnpassword=supersecretn" >> .my.cnf ; предыдущие комментарии о awk и sed все равно будут применяться, если предполагается добавить строки где-нибудь в «середине» файла (в соответствии с первоначальными требованиями вопроса)