如何用grep/awk或脚本筛选文本中距今4天前的MySQL备份文件?
我来帮你搞定这个需求!针对你说的MySQL备份文件名筛选,我整理了几种实用的方法,你可以根据自己的习惯选:
一、命令行组合方案(grep + awk + date)
这个方案适合直接在终端快速处理,不需要写脚本:
先计算出4天前的日期(格式和文件名里的一致:YYYY-MM-DD):
- Linux系统:
target_date=$(date -d "-4 days" +%Y-%m-%d) - macOS系统(date命令参数不同):
target_date=$(date -v -4d +%Y-%m-%d)
- Linux系统:
从你的文件名列表文件(假设叫
backup_list.txt)中筛选符合条件的文件:grep -E "MySql-DataBase-[0-9]{4}-[0-9]{2}-[0-9]{2}_" backup_list.txt | awk -v target="$target_date" '{ # 提取文件名中的日期部分(从第16位开始取10个字符) file_date = substr($0, 16, 10) if (file_date <= target) print $0 }'
二、纯awk方案(更简洁)
如果不想用grep,直接用awk就能完成所有逻辑,跨平台只需调整date命令:
Linux版本:
awk -v target="$(date -d "-4 days" +%Y-%m-%d)" '{ match($0, /MySql-DataBase-([0-9]{4}-[0-9]{2}-[0-9]{2})_/, date_arr) if (date_arr[1] <= target) print $0 }' backup_list.txtmacOS版本:
awk -v target="$(date -v -4d +%Y-%m-%d)" '{ match($0, /MySql-DataBase-([0-9]{4}-[0-9]{2}-[0-9]{2})_/, date_arr) if (date_arr[1] <= target) print $0 }' backup_list.txt
三、Python脚本方案(灵活易扩展)
如果需要更灵活的处理(比如后续要加其他筛选条件),Python脚本是不错的选择:
import datetime import re # 替换成你的文件名列表文件路径 file_path = "backup_list.txt" # 计算4天前的日期 four_days_ago = datetime.date.today() - datetime.timedelta(days=4) target_date = four_days_ago.strftime("%Y-%m-%d") # 读取文件并筛选 with open(file_path, "r", encoding="utf-8") as f: for line in f: line = line.strip() # 用正则提取日期(适配固定格式的文件名) match_result = re.search(r"MySql-DataBase-(\d{4}-\d{2}-\d{2})_", line) if match_result: file_date = match_result.group(1) if file_date <= target_date: print(line)
使用方法:保存为filter_backups.py,然后在终端运行python filter_backups.py即可。
四、PHP脚本方案(适合PHP开发者)
要是你平时用PHP更多,这个脚本也能轻松实现需求:
<?php // 文件名列表文件路径 $listFile = "backup_list.txt"; // 计算4天前的日期,格式YYYY-MM-DD $targetDate = date("Y-m-d", strtotime("-4 days")); // 读取文件内容(跳过空行) $lines = file($listFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); foreach ($lines as $filename) { // 用正则提取日期部分 preg_match("/MySql-DataBase-(\d{4}-\d{2}-\d{2})_/", $filename, $matches); if (isset($matches[1]) && $matches[1] <= $targetDate) { echo $filename . PHP_EOL; } } ?>
使用方法:保存为filter_backups.php,然后运行php filter_backups.php。
这些方法都能帮你精准筛选出当前日期减4天及更早的备份文件,要是你文件名格式有细微变化,只需要调整正则表达式或者字符串截取的位置就行~
内容的提问来源于stack exchange,提问作者Am3Y




