Как в скрипте на bash добавить или обновить блок кода в файле?

Как написать баш-скрипт для поиска блока конфигурации в файле `/etc/logrotate.d/syslog-ng` на Astra Linux, заменить его своими значениями в случае наличия или добавить, если блока нет? А также, как улучшить функцию `check_file_content_2`, чтобы она корректно реализовывала задачу поиска и добавления блока?
  • 24 мая 2024 г. 8:11
Ответы на вопрос 2
Для добавления или обновления блока кода в файле на bash можно воспользоваться утилитами `grep`, `sed` и `awk`. Вот пример такого скрипта:

```bash
#!/bin/bash

conf_file="/etc/logrotate.d/syslog-ng"
new_block="
# New block code
/var/log/syslog-ng/*.log {
    compress
    size 100k
    rotate 5
    daily
    missingok
    notifempty
    copytruncate
}
"

if grep -q "/var/log/syslog-ng/*.log" "$conf_file"; then
    sed -i '/\/var\/log\/syslog-ng\/\*\.log/, /^}/c\'"$new_block" "$conf_file"
else
    echo "$new_block" >> "$conf_file"
fi
```

Этот скрипт сначала проверяет, существует ли блок конфигурации в файле `/etc/logrotate.d/syslog-ng`. Если он существует, то блок заменяется на новый. Если блока нет, то новый блок добавляется в конец файла.

Чтобы улучшить функцию `check_file_content_2` для реализации поиска и добавления блока, можно сделать следующие изменения:

```bash
check_file_content_2() {
    local file="$1"
    local search_pattern="$2"
    local block="$3"

    if grep -q "$search_pattern" "$file"; then
        sed -i "/$search_pattern/, /^}/c\\$block" "$file"
    else
        echo "$block" >> "$file"
    fi
}

# Пример использования:
conf_file="/etc/logrotate.d/syslog-ng"
search_pattern="/var/log/syslog-ng/*.log"
new_block="
# New block code
/var/log/syslog-ng/*.log {
    compress
    size 100k
    rotate 5
    daily
    missingok
    notifempty
    copytruncate
}
"

check_file_content_2 "$conf_file" "$search_pattern" "$new_block"
```

Эти изменения позволят использовать функцию `check_file_content_2` для поиска и добавления блока в указанный файл с помощью переданных параметров.
Если вам надо писать на баше, то надо делать ровно то, что надо, и не более. Баш достаточно буквальный язык. <br/> <br/> Первая часть: <br/> <pre><code class="bash">#!/bin/bash

# Создаем шаблон конфига из скрипта (без использования массива)
cat &gt; ./syslog-template &lt;&lt;"EOF"
/var/log/syslog
{
  rotate 10
  size 10M
  daily
  missingok
  copytruncate
  notifempty
  compress
  delaycompress
  sharedscripts
  postrotate
    invoke-rc.d syslog-ng reload &gt; /dev/null
  endscript
}
EOF

# Удаляем секцию из файла
sudo sed -i '/\/var\/log\/syslog/,/}/d' /etc/logrotate.d/syslog-ng
# Добавляем секцию в файл
# Тут, возможно, надо будет " | sudo tee -a" вместо пайпа
cat ./syslog-template &gt;&gt; /etc/logrotate.d/syslog-ng</code></pre> <br/> <br/> Вторая часть (не уверен, зачем она вообще нужна (так как изменения, внесенные первой частью, идемпотентны), но, раз вопрос так стоит, то пусть будет): <br/> <pre><code class="bash">#!/bin/bash

# На момент вызова файл шаблона должен существовать
ORIGINAL=$(cat ./syslog-template) 
EXISTING=$(sed -rne '/\/var\/log\/syslog/,/}/p' /etc/logrotate.d/syslog-ng)
[[ "$ORIGINAL" == "$EXISTING" ]] &amp;&amp; echo "файл настроен" || echo "файл не настроен"</code></pre>
Похожие вопросы