/ / iterare i nomi dei file di log di apache 2 e confrontare i numeri usando linux bash - regex, linux, bash, apache

iterare su apache 2 nomi di file di registro e confrontare i numeri usando Linux bash - regex, linux, bash, apache

Ecco un esempio di log nella mia cartella / 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 va fino al 50 ...

Vorrei scorrere questi file e rimuovere tutti i file di registro che sono maggiori di 5.

l'uso della sintassi regex mi darà la possibilità diabbina i numeri nel modello di [1-9] o {1,2} ma questo corrisponderà anche ai file di registro che non voglio eliminare (numeri singoli 1-5 file di registro che desidero conservare)

Come posso abbinare solo i nomi di file con numeri superiori a 5?

Grazie!

risposte:

2 per risposta № 1

Puoi usare awk one-liner per questo:

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

Questo comando awk utilizza dot come separatore di campo e confrontato $(NF-1) (ovvero il campo numerico prima dell'estensione) con il numero 5.

Per eliminare questi file utilizzare:

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

xargs accetta input da awk e rm comando elimina solo quei file.


1 per risposta № 2

Usa il bash, operatore regex ~ per estrarre il numero e elenco il file se il numero era maggiore di 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 vuoi solo Elimina i file, sostituisci printf "%sn" per giusto rm.


0 per risposta № 3

Trova con espressioni regolari

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

Trova tutti i file corrispondenti a no_domain ... e quindi esegui un'altra espressione regolare per ottenere tutti questi risultati meno i file da 1 a 5.


0 per risposta № 4

Senza espressioni regolari, usando globs di shell e codice shell POSIX interamente nativo e portatile:

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

È più facile in bash:

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

Questi sono probabilmente creati con logrotate o un simile rotazione del registro utilità.
Potresti voler solo cambiare la sua configurazione per memorizzare solo cinque registri.

Se è controllato da logrotate, puoi trovare la documentazione con man logrotate e probabilmente troverai qualcosa del genere:

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

Cambiare il 50 a 5 e hai finito. Probabilmente (?) devi ancora ripulire i vecchi registri attuali usando uno dei comandi sopra.