Regex 使用LinuxBash迭代Apache2日志文件名并比较数字

Regex 使用LinuxBash迭代Apache2日志文件名并比较数字,regex,linux,bash,apache,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.

下面是我的/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的文件名


谢谢

如果数字大于
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

您可以使用
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
命令只删除这些文件。

使用正则表达式查找

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

查找与no\u域匹配的所有文件。。。然后运行另一个正则表达式以获得所有这些结果减去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控制,您可以使用找到文档,您可能会发现如下内容:

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

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

非常感谢,但请您解释一下,我对awk和xargs不太熟悉。当然,我已经添加了它。