Shell脚本中如何用正则匹配含固定日期戳与可变时间戳的日志文件
文件名通配匹配解决方案
问题核心
需要匹配格式为backup_<主机名>_<8位日期戳><4位可变数字时间戳>.log的文件,已知日期戳,需精确匹配后续4位可变时间戳。
正确通配符写法
1. 基础正则匹配(兼容所有POSIX Shell)
直接用4个[0-9]精确匹配4位数字,无需额外配置:
log_file_pattern="backup_${hostname_arg}_${logfile_sunday}[0-9][0-9][0-9][0-9].log"
2. Bash扩展通配符(更简洁)
先开启Bash扩展通配符支持:
shopt -s extglob
然后可选择两种简洁写法:
- 匹配任意4个字符(结合场景仅匹配数字):
log_file_pattern="backup_${hostname_arg}_${logfile_sunday}????.log"
- 严格匹配4位数字:
log_file_pattern="backup_${hostname_arg}_${logfile_sunday}[0-9]{4}.log"
之前写法的问题
[0-9]*:会匹配1个及以上任意数字,可能匹配超过4位的情况,甚至误匹配带多余字符的文件。{....}:这是Shell的大括号扩展语法,会生成字面量的....,而非通配符匹配,因此无法生效。
文件存在检测示例
# 示例变量赋值 hostname_arg="myserver" logfile_sunday="20231015" # 定义匹配模式 log_file_pattern="backup_${hostname_arg}_${logfile_sunday}[0-9][0-9][0-9][0-9].log" # 检测是否存在匹配文件 if compgen -G "$log_file_pattern" > /dev/null; then echo "找到符合条件的备份文件" else echo "未找到符合条件的备份文件" fi
内容的提问来源于stack exchange,提问作者Lars H
相关产品推荐
相关产品推荐

