Como inserir linhas em arquivos específicos nos quais uma string não está presente?

0

Estou procurando ajuda com um pequeno script.

Eu gostaria de pesquisar todos os arquivos correspondentes a

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

para a string

centralized.log

Se a string não estiver presente em um arquivo, eu gostaria de inserir 2 linhas nela.

Atualmente, tenho o seguinte script:

#!/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

No momento, se a string não for encontrada em nenhum dos arquivos, as linhas serão inseridas em todos os arquivos e, se a string for encontrada em pelo menos um arquivo, nada acontece. Posso fazer com que as linhas sejam adicionadas a todos os arquivos nos quais a string não esteja presente?

    
por wtptrs 09.08.2015 / 20:10

2 respostas

0

Isso deve funcionar:

#!/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

Você pode unir as duas linhas de sed, mas o que eu mantive é o mais próximo possível do seu exemplo.

    
por 10.08.2015 / 05:28
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

Isso itera apenas sobre todos os arquivos listados por grep . Eu acho que é mais legível assim.

EDIT: versão robusta

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

Veja esta resposta para entender melhor o texto acima.

EDIT2: Espero que isso satisfaça @ alex-stragies. Manteve a edição anterior para o registro.

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' %"

Se um usuário puder ser nomeado com um caractere % , basta alterá-lo de acordo.

    
por 10.08.2015 / 14:30