如何用Bash脚本筛选文件中早于指定天数的所有行?
修正后的Bash脚本实现方案
你的问题在于原脚本仅用grep匹配了特定某一天的日期(即当前日期减2天),无法覆盖更早的日期范围。要实现筛选所有早于X天的行,需要利用YYYYMMDD格式可直接按数字大小比较的特性,用awk来做范围判断,具体步骤如下:
1. 完整修正脚本
# 计算截止日期:这里设置为早于2天,所有日期小于该值的行都会被保留 cutoff_date=$(date +%Y%m%d --date="-2 day") # 用awk提取每行的日期字段,与截止日期比较,输出符合条件的行到新文件 awk -F '_' -v cutoff="$cutoff_date" '$2 < cutoff' myfile > filtered_myfile
2. 脚本说明
- 截止日期计算:
date +%Y%m%d --date="-2 day"会生成当前日期往前推2天的YYYYMMDD格式字符串(比如当天是20231014,结果就是20231012)。如果需要筛选早于3天的行,只需把-2改成-3即可。 - awk处理逻辑:
-F '_':指定下划线为字段分隔符,每行的第二个字段$2就是我们需要的YYYYMMDD日期。-v cutoff="$cutoff_date":把Shell变量传递给awk环境。$2 < cutoff:直接比较日期字符串(YYYYMMDD格式的字符串按数字大小比较等价于日期先后),保留所有日期早于截止日期的行。
- 输出结果:符合条件的行会被写入
filtered_myfile新文件中。
3. 示例验证
假设当天是20231014,cutoff_date为20231012,脚本会保留所有$2(日期字段)小于20231012的行,也就是20231002到20231011的所有记录,完全符合你的需求。
内容的提问来源于stack exchange,提问作者foscolino
相关产品推荐
相关产品推荐

