Я ищу помощь с небольшим сценарием.

Я хотел бы найти все файлы, соответствующие

/usr/local/directadmin/data/users/*/httpd.conf

для строки

centralized.log

Если строка отсутствует в файле, я хотел бы вставить в нее 2 строки.

В настоящее время у меня есть следующий скрипт:

#!/bin/bash
if ! grep -q centralized.log /usr/local/directadmin/data/users/*/httpd.conf ; then
sed -i '33iCustomLog /var/log/centralized.log combined' /usr/local/directadmin/data/users/*/httpd.conf && sed -i '65iCustomLog /var/log/centralized.log combined' /usr/local/directadmin/data/users/*/httpd.conf
fi

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

2 ответа2

0
for f in $(grep -l centralized.log /usr/local/directadmin/data/users/*/httpd.conf);
do
  sed -i '33iCustomLog /var/log/centralized.log combined' "$f" && \
  sed -i '65iCustomLog /var/log/centralized.log combined' "$f"
done

Это повторяется только для всех файлов, перечисленных grep . Я думаю, что так читается лучше.

РЕДАКТИРОВАТЬ: надежная версия

function dofile {
  sed -i '33iCustomLog /var/log/centralized.log combined' "$1" && \
  sed -i '65iCustomLog /var/log/centralized.log combined' "$1"
}
grep -l centralized.log /usr/local/directadmin/data/users/*/httpd.conf | while read -r; do dofile "$REPLY"; done

Посмотрите этот ответ, чтобы лучше понять вышесказанное.

РЕДАКТИРОВАТЬ 2: Надеюсь, это удовлетворит @ alex-stragies. Сохранено предыдущее редактирование для записи.

find /usr/local/directadmin/data/users/ -maxdepth 2 -mindepth 2 -name httpd.conf | \
xargs -L1 -I% sh -c \
"sed -i '33iCustomLog /var/log/centralized.log combined' % && sed -i '65iCustomLog /var/log/centralized.log combined' %"

Если имя пользователя можно назвать с помощью % char, просто измените его соответствующим образом.

0

Это должно сделать трюк:

#!/bin/bash
for f in /usr/local/directadmin/data/users/*/httpd.conf ; do
  if ! grep -q centralized.log "$f" ; then
    sed -i '33iCustomLog /var/log/centralized.log combined' "$f" ;
    sed -i '65iCustomLog /var/log/centralized.log combined' "$f" ;
  fi ;
done

Вы могли бы объединить обе строки sed, но я придерживаюсь как можно ближе к вашему примеру.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .