以下是我的/ 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的文件名?
谢谢!
答案 0 :(得分:2)
您可以使用awk
单行代码:
printf '%s\n' *[0-9].gz | awk -F '.' '$(NF-1) >= 5'
此awk命令使用点作为字段分隔符,并将$(NF-1)
(扩展前的数字字段)与数字5
进行比较。
要删除这些文件,请使用:
printf '%s\n' *[0-9].gz | awk -F '.' '$(NF-1) >= 5' | xargs rm
xargs
从awk
获取输入,rm
命令只删除这些文件。
答案 1 :(得分:1)
如果数字大于bash
~
,正则表达式运算符5
提取数字和列表文件
for file in /var/www/apache2/log/*.gz; do
test -f "$file" || continue
[[ $file =~ ^.*log\.([[:digit:]]+).*$ ]] && { (( "${BASH_REMATCH[1]}" > 5 )) && printf "%s\n" "$file"; }
done
如果您只想删除文件,请将printf "%s\n"
替换为rm
。
答案 2 :(得分:0)
使用正则表达式查找
find . -regex './no_domain_access.log.*gz' ! -regex './no_domain_access.log.[1-5].gz'
查找与no_domain匹配的所有文件...然后运行另一个正则表达式以获得所有这些结果减去1到5的文件。
答案 3 :(得分:0)
没有正则表达式,使用shell globs和完全原生的&便携式POSIX shell代码:
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
这些可能是使用logrotate或类似的log rotation实用程序创建的。
您可能只想将其配置更改为仅存储五个日志。
如果它受logrotate控制,您可以找到包含man logrotate
的文档,您可能会发现以下内容:
/var/log/no_domain_access.log {
rotate 50
daily
}
将50
更改为5
,您就完成了。您可能(?)仍然需要使用上述命令之一清理当前的旧日志。