/ / itera sobre nomes de arquivos de log do apache 2 e compara números usando o linux bash - regex, linux, bash, apache

iterar pelo apache 2 nomes de arquivos de log e comparar números usando o bash do linux - regex, linux, bash, apache

Aqui está um exemplo de logs na minha pasta / var / www / apache2 / log

./no_domain_access.log.7.gz
./no_domain_access.log.8.gz
./no_domain_access.log.9.gz
./no_domain_error.log.10.gz
./no_domain_error.log.11.gz
./no_domain_error.log.12.gz
./no_domain_error.log.13.gz
./no_domain_error.log.14.gz
./no_domain_error.log.15.gz
./no_domain_error.log.16.gz
./no_domain_error.log.17.gz
./no_domain_error.log.18.gz
./no_domain_error.log.19.gz
./no_domain_error.log.20.gz

e vai até 50 ...

Gostaria de iterar sobre esses arquivos e remover todos os arquivos de log maiores que 5.

usando a sintaxe regex me dará a opção decorresponder a números no padrão de [1-9] ou {1,2}, mas isso também corresponderá aos arquivos de log que eu não quero excluir (números únicos de 1 a 5 arquivos de log que desejo manter)

Como posso combinar apenas nomes de arquivos com números maiores que 5?

Obrigado!

Respostas:

2 para resposta № 1

Você pode usar awk uma linha para isso:

printf "%sn" *[0-9].gz | awk -F "." "$(NF-1) >= 5"

Este comando awk usa ponto como separador de campo e comparado $(NF-1) (esse é o campo numérico antes do ramal) com número 5.

Para excluir esses arquivos, use:

printf "%sn" *[0-9].gz | awk -F "." "$(NF-1) >= 5" | xargs rm

xargs recebe entrada de awk e rm O comando apenas exclui esses arquivos.


1 para resposta № 2

Use o bashoperador regex ~ para extrair o número e Lista o arquivo se o número for maior que 5

for file in /var/www/apache2/log/*.gz; do
test -f "$file" || continue
[[ $file =~ ^.*log.([[:digit:]]+).*$ ]] && { (( "${BASH_REMATCH[1]}" > 5  )) && printf "%sn" "$file"; }
done

Se você quer apenas excluir os arquivos, substitua printf "%sn" por apenas rm.


0 para resposta № 3

Localizar com expressões regulares

find . -regex "./no_domain_access.log.*gz" ! -regex "./no_domain_access.log.[1-5].gz"

Encontre todos os arquivos que correspondam a no_domain ... e execute outra expressão regular para obter todos esses resultados menos os arquivos com 1 a 5.


0 para a resposta № 4

Sem expressões regulares, usando shell globs e código de shell POSIX totalmente nativo e portátil:

rm -f no_domain_access.log.[6-9].gz no_domain_access.log.[0-9][0-9].gz

É mais fácil no bash:

rm -f no_domain_access.log.{6..50}.gz

Estes são provavelmente criados com logrotate ou um similar rotação de log utilidade.
Você pode apenas alterar sua configuração para armazenar apenas cinco logs.

Se for controlado por logrotate, você poderá encontrar a documentação com man logrotate e você provavelmente encontrará algo parecido com isto:

/var/log/no_domain_access.log {
rotate 50
daily
}

Mudar o 50 para 5 e você está pronto. Você provavelmente (?) ainda precisa limpar os logs antigos atuais usando um dos comandos acima.