私の/ 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
}
変更 50
に 5
上記のコマンドの1つを使用して、現在の古いログをクリーンアップする必要があります(おそらく?)。