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 № 1Puoi 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.