Bash 在sed-n命令的模式中使用变量提取上月';记录日志文件中的条目

Bash 在sed-n命令的模式中使用变量提取上月';记录日志文件中的条目,bash,file,date,logging,sed,Bash,File,Date,Logging,Sed,我到处都找过了,但我能找到的唯一解决方案是在日期中进行硬编码,因此与我无关 我有一个这样的日志文件: 2018-01-31: Random string. 2018-01-23: More text. 2017-12-30: Some more text. 等等 我希望编写一个Bash脚本,将上个月的行提取到一个新文件中,例如: 2018-01-31: Random string. 2018-01-23: More text. 我能找到的最接近的解决方案是使用sed,例如: sed

我到处都找过了,但我能找到的唯一解决方案是在日期中进行硬编码,因此与我无关

我有一个这样的日志文件:

2018-01-31: Random string. 
2018-01-23: More text. 
2017-12-30: Some more text.
等等

我希望编写一个Bash脚本,将上个月的行提取到一个新文件中,例如:

2018-01-31: Random string. 
2018-01-23: More text. 
我能找到的最接近的解决方案是使用sed,例如:

sed -n '/Feb 23 13:55/,/Feb 23 14:00/p' file.txt
问题是日期是硬编码的(并且采用不同的日期格式,但这并不重要)。我需要一个解决方案,将与一个可变的日期,因为脚本将通过cron在每个月初运行

所以,我提出了以下建议

#Define date variables
DATEYYYY=$(date +"%Y")
DATEMM=$(date +"%m")
LASTYEAR=$(expr $DATEYYYY - 1)
LASTMONTH=$(expr $DATEMM - 1)

#Use only last month's update information.
if [[ $DATEMM -eq 1 ]]
then
    sed -n "/$LASTYEAR-12-01/,/$LASTYEAR-12-31/p" file.txt > file2.txt
else
    sed -n "/$DATEYYYY-$LASTMONTH-01/,/$DATEYYYY-$LASTMONTH-31/p" file.txt > file2.txt
fi
(旁注:如果脚本在1月份运行,则需要进行测试,因为这意味着年份号必须是前一年,因此需要if语句。如果存在,我也希望有更优雅的解决方案……)

上面的问题是最终结果是一个空文件2.txt,我不知道为什么。 我看过各种各样的指南,解释如何在sed中使用变量,但我无法理解


请提供一些帮助?

您真的不需要异常,date命令可以为您完成这项工作,因此它变成了一行:

sed -n "/^$(date -d "last month" +%Y-%m)/p" file.txt > file2.txt
请注意,我将搜索定位到了行“^”的开头,因此任何以匹配的YYYY-MM开头的内容都将被输出(与文本中可能包含该YYYY-MM的内容相反)


您的解决方案不起作用的原因是,它试图匹配匹配的开始日期和匹配的结束日期之间的所有行,因此2018-01-01必须存在于文件中,并且在2018-01-31行之前,2018-01-31行也必须存在(2018-02-31的问题),而不是匹配范围,我的匹配每一行。

您确实不需要异常,date命令可以为您执行该操作,因此它变成了一行:

sed -n "/^$(date -d "last month" +%Y-%m)/p" file.txt > file2.txt
请注意,我将搜索定位到了行“^”的开头,因此任何以匹配的YYYY-MM开头的内容都将被输出(与文本中可能包含该YYYY-MM的内容相反)


您的解决方案不起作用的原因是,它试图匹配匹配开始日期和结束日期之间的所有行,因此2018-01-01必须存在于文件中,并且在2018-01-31行之前,该行也必须存在(2018-02-31的一个问题),因此,我的匹配不是匹配范围,而是匹配每一行。

Ahh ok,那就解释了!非常感谢-您的解决方案非常有效。:)啊,好吧,这就解释了!非常感谢-您的解决方案非常有效。:)