迭代Apache 2的日志文件名称,并使用Linux bash比较数字

以下是我的/ 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的日志文件。

使用正则expression式将给我的选项来匹配[1-9]或{1,2}模式中的数字,但这也将匹配我不想删除的日志文件(单个数字1-5日志文件,我希望保持)

我怎样才能匹配只有文件名与数字高于5?

谢谢!

你可以使用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 

xargsawk获取输入,而rm命令只是删除这些文件。

如果数字大于5 ,则使用bash ,regex操作符~来提取数字并列出文件

 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 

如果你只是想删除这些文件,用rm替换printf "%s\n"

用正则表达式查找

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

找到所有匹配no_domain的文件…然后运行另一个正则表达式来获得所有这些结果减1到5的文件。

没有正则表达式,使用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或类似的日志轮转实用程序创建的。
您可能只想将其配置更改为仅存储五个日志。

如果它是由logrotate控制的,你可以用man logrotate找到文档,你可能会发现这样的东西:

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

50改为5 ,就完成了。 您可能(?)仍然需要使用上述命令之一清理当前的旧日志。