/ / iteruj nad apache 2 nazwami plików dziennika i porównuj liczby przy użyciu linux bash - regex, linux, bash, apache

iteruj nazwy plików protokołu Apache 2 i porównaj numery za pomocą linux bash - regex, linux, bash, apache

Oto przykład dzienników w moim folderze / 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

i idzie do 50 ...

Chciałbym powtórzyć te pliki i usunąć wszystkie pliki dziennika większe niż 5.

użycie składni regex da mi opcjędopasuj liczby we wzorcu [1-9] lub {1,2}, ale będzie to również pasować do plików dziennika, których nie chcę usuwać (pojedyncze pliki dziennika 1-5, które chcę zachować)

Jak mogę dopasować tylko nazwy plików o numerach wyższych niż 5?

Dzięki!

Odpowiedzi:

2 dla odpowiedzi № 1

Możesz użyć awk jedno-liniowy do tego:

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

To polecenie awk używa kropki jako separatora pól i porównuje $(NF-1) (to jest pole numeryczne przed rozszerzeniem) z liczbą 5.

Aby usunąć te pliki, użyj:

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

xargs pobiera dane wejściowe z awk i rm polecenie po prostu usuwa te pliki.


1 dla odpowiedzi nr 2

Użyj bash, operator wyrażenia regularnego ~ wyodrębnić liczbę i lista plik, jeśli liczba była większa niż 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

Jeśli tylko chcesz kasować pliki, zamień printf "%sn" po prostu rm.


0 dla odpowiedzi № 3

Znajdź za pomocą wyrażeń regularnych

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

Znajdź wszystkie pliki pasujące do no_domain ..., a następnie uruchom inne wyrażenie regularne, aby uzyskać wszystkie wyniki bez plików od 1 do 5.


0 dla odpowiedzi nr 4

Bez wyrażeń regularnych, używając globusów powłoki oraz całkowicie natywnego i przenośnego kodu powłoki POSIX:

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

Łatwiej jest w bash:

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

Te są prawdopodobnie tworzone za pomocą logrotate lub podobny rotacja dziennika użyteczność.
Możesz po prostu zmienić jego konfigurację, aby przechowywać tylko pięć dzienników.

Jeśli jest kontrolowany przez logrotate, możesz znaleźć dokumentację za pomocą man logrotate i prawdopodobnie znajdziesz coś takiego:

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

Zmienić 50 do 5 i gotowe. Prawdopodobnie (?) nadal musisz wyczyścić bieżące stare dzienniki za pomocą jednego z powyższych poleceń.