/ / apache 2のログファイル名を繰り返し、linux bash-regex、linux、bash、apacheを使って数値を比較する

Apache 2のログファイル名を繰り返し、linux bash-regex、linux、bash、apacheを使って数値を比較する

私の/ 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

50になるまで行く...

これらのファイルを繰り返し処理し、5以上のすべてのログファイルを削除したいと思います。

正規表現の構文を使用すると、私にオプションを与える[1-9]や{1,2}のパターンで一致しますが、これは削除したくないログファイル(1〜5のログファイル)

ファイル名だけを5以上の数字と照合するにはどうすればよいですか?

ありがとう!

回答:

回答№1は2

あなたは使うことができます awk これのための1つのライナー:

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

このawkコマンドは、ドットをフィールド区切りとして使用し、 $(NF-1) (つまり、拡張前の数値フィールド)の番号 5.

これらのファイルを削除するには、

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

xargs からの入力を受け取ります awk そして rm コマンドはそれらのファイルを削除するだけです。


回答№2の場合は1

使用 bash、正規表現演算子 ~ 数を抽出する リスト 数値が大きい場合はファイル 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

あなたがしたいだけなら 削除 ファイル、置換 printf "%sn" だけで rm.


回答№3の場合は0

正規表現で検索

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

no_domain ...と一致するすべてのファイルを検索して、これらの結果から1〜5のファイルを除いた別の正規表現を実行します。


回答№4の場合は0

正規表現がなければ、シェルglobと完全にネイティブで移植可能なPOSIXシェルコードを使用します:

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

bashのほうが簡単です:

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

これらはおそらく ログローテート または同様のもの ログの回転 ユーティリティ。
5つのログのみを保存するように設定を変更することができます。

logrotateによって制御されている場合は、 man logrotate あなたはおそらくこのようなものを見つけるでしょう:

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

変更 505 上記のコマンドの1つを使用して、現在の古いログをクリーンアップする必要があります(おそらく?)。