Командная строка для редактирования значения файла конфигурации без интерактивного редактора

Итак, я в конце концов решил проблему, вот ответ для тех, кто столкнется с той же проблемой. Ошибка была на самом деле довольно глупой, но я заметил ее только после того, как узнал, как работает ведение журнала в пустоте, каким-то образом только системный журнал (, но не журнал postgres )показывал ошибку, которая читалась SSL is not supported in this build, поэтому Я начал копать таким образом и в конце концов понял, что флаг -lв команде выполнения службы заставляет использовать SSL, который мне не нужен. Итак, окончательный файл запуска, с которым у меня все заработало, это:

# /etc/sv/postgresql/run:
#!/bin/sh
exec chpst -u postgres:postgres /usr/local/pgsql/bin/postgres -D '/var/lib/postgresql/data' 2>&1

Также логирование для сервиса включается созданием папки /etc/sv/postgresql/logи созданием в ней файла(/etc/sv/postgresql/log/run)с содержимым:

#!/bin/sh
exec logger -p daemon.info -t postgres

Также установите демон системного журнала, чтобы на самом деле сохранять журналы (например. носки -пустота)

0
29.03.2021, 09:39
1 ответ

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

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

вот два примера использования sed и awk, которые помогут вам начать работу

простая команда sed для замены значения ключа на простой key valueсинтаксис

$ sed 's/^key2 value2$/key2 newvalue2/' config 

пример

$ cat config 
key1 value1
key2 value2
key3 value3

$ sed 's/^key2 value2$/key2 newvalue2/' config 
key1 value1
key2 newvalue2
key3 value3

но будьте осторожны :если есть еще key2 value2строк (возможно в других разделах конфигурационного файла )тогда все будут заменены. это трудно предотвратить в sed (возможно, но сложно )и проще в awk. см. ниже команду awk, которая учитывает разделы.

объяснение:

эта команда sed делает примерно следующее:

for every line:
  if line is "key2 value2":
    print "key2 newvalue2"

эта команда sed s/pattern/replace/означает :в каждой строке ищите patternи, если найдено, замените на replace. patternможет быть обычной строкой или regex (регулярным выражением ).

^и &в регулярном выражении называются якорями и означают начало строки и конец строки соответственно. без якорей этот шаблон key2 value2также соответствовал бы этой строке xkey2 value2x, и результаты были бы xkey2 newvalue2x.

вот несколько примеров того, как мы можем изменить поведение с помощью шаблона.

также работает с синтаксисом key=value

$ sed 's/^key2=value2$/key2=newvalue2/' config 

чтобы просто сопоставить ключ независимо от старого значения

$ sed 's/^key2=.*/key2=newvalue2/' config 

для удаления возможного знака комментария

$ sed 's/^#\?key2 value2$/key2 newvalue2/' config 

чтобы увидеть, что что-то было изменено, если вы перенаправляете вывод, вы также можете распечатать в stderr

$ sed 's/^#\?key2 value2$/key2 newvalue2/ w /dev/stderr' config > newconfig

с правильным регулярным выражением можно сделать гораздо больше. но это был бы еще один ответ на другой вопрос.

вот скрипт awk, который также может обрабатывать разделы конфигурации

/^\[section2\]$/ {
  print
  insection2=1
  next
}
insection2 && /^#?key2=value2$/ {
  print "key2=newvalue2"
  next
}
/^\[.*\]$/ {
  insection2=0
}
1

используйте так

$ awk -f configer.awk config

пример

$ cat config 
[section1]
key1=value1
key2=value2

[section2]
key1=value1
key2=value2

[section3]
key1=value1
key2=value2

$ awk -f configer.awk config 
[section1]
key1=value1
key2=value2

[section2]
key1=value1
key2=newvalue2

[section3]
key1=value1
key2=value2

вы также можете добавить подробный вывод в stderr, чтобы вы могли видеть, что изменилось, если вы перенаправляете вывод

insection2 && /^#?key2=value2$/ {
  print "key2=newvalue2"
  print "changed line "NR > "/dev/stderr"
  next
}

краткое объяснение скрипта awk

первое правило ищет заголовок секции [config2]. он установит для флага insection2значение true

второе правило ищет строку key2=value2. но только если флаг insection2истинен. затем он напечатает строку с новым значением.

третье правило ищет любой другой заголовок раздела. он сбросит флаг insection2в false.

последнее правило (единственное1)является "правилом по умолчанию". он просто напечатает строку без изменений.

в псевдокоде

for every line:
  if line is [section2]:
    note that we are in section2
  else if we are in section2 and line is key2=value2:
    print modified line
  else if line is any other section header:
    note that we are no longer in section2
  else
    print line unchanged
2
28.04.2021, 22:55

Теги

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