/ / iterar sobre los nombres de los archivos de registro de apache 2 y comparar números usando linux bash - regex, linux, bash, apache

iterar sobre los nombres de los archivos de registro de apache 2 y comparar números usando linux bash - regex, linux, bash, apache

Aquí hay un ejemplo de registros en mi / var / www / apache2 / log folder-

./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

y va hasta los 50 ...

Me gustaría iterar sobre esos archivos y eliminar todos los archivos de registro que sean mayores que 5.

el uso de la sintaxis de expresiones regulares me dará la opción dehaga coincidir los números en el patrón de [1-9] o {1,2}, pero esto también coincidirá con los archivos de registro que no deseo eliminar (números únicos de 1 a 5 archivos de registro que deseo conservar)

¿Cómo puedo hacer coincidir solo los nombres de archivo con números superiores a 5?

¡Gracias!

Respuestas

2 para la respuesta № 1

Puedes usar awk una sola línea para esto:

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

Este comando awk usa el punto como separador de campo y se compara $(NF-1) (ese es el campo numérico antes de la extensión) con número 5.

Para borrar estos archivos usa:

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

xargs toma la entrada de awk y rm comando simplemente elimina esos archivos.


1 para la respuesta № 2

Utilizar el bashoperador regex ~ para extraer el número y lista el archivo si el número era mayor 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

Si solo quieres borrar los archivos, reemplazar printf "%sn" por solo rm.


0 para la respuesta № 3

Encuentra con expresiones regulares

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

Encuentre todos los archivos que coincidan con no_domain ... y luego ejecute otra expresión regular para obtener todos estos resultados menos los archivos con 1 a 5.


0 para la respuesta № 4

Sin expresiones regulares, usando shell globs y código de shell POSIX completamente nativo y portátil:

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

Es más fácil en bash:

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

Estos son probablemente creados con logrotate o similar rotación de registro utilidad.
Es posible que desee simplemente cambiar su configuración para almacenar solo cinco registros.

Si está controlado por logrotate, puede encontrar la documentación en man logrotate y probablemente encontrarás algo como esto:

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

Cambiar el 50 a 5 y ya está. Probablemente (?) todavía tenga que limpiar los registros antiguos actuales utilizando uno de los comandos anteriores.