我有一个日志文件abc.log,其中每一行都是date +%m%d%y
格式的日期:
061019:12
062219:34
062319:56
062719:78
我想查看该日期范围(日期前7天到当前日期)之间的所有日志,即(在这种情况下为062019到062719)。结果应该是:
062219:34
062319:56
062719:78
我尝试了几件事来实现:
awk '/062019/,/062719' abc.log
这为我提供了正确的答案,但是如果我不想对日期值进行硬编码并尝试实现相同的值,则不会给出正确的值。
awk '/date --date "7 days ago" +%m%d%y/,/date +%m%d%y' abc.log
注意:
date --date "7 days ago" +%m%d%y
→062019
(追溯7天)date +%m%d%y
→062719
(当前日期)任何建议如何实现?
答案 0 :(得分:0)
很遗憾,您的middle-endian日期格式不能用于排序和比较。 Y-m-d
会容易得多。
您在awk中使用,
范围的方法每天只需要一个日志条目(并且日志条目按时间顺序排序)。
我会使用perl,例如像这样:
perl -MPOSIX=strftime -ne '
BEGIN { ($start, $end) = map strftime("%y%m%d", localtime $_), time - 60 * 60 * 24 * 7, time }
print if /^(\d\d)(\d\d)(\d\d):/ && "$3$1$2" ge $start && "$3$1$2" le $end' abc.log
strftime "%y%m%d"
以big-endian格式获取日期范围的结尾(允许按字典顺序进行比较)。答案 1 :(得分:0)
要解决寻找可能不存在的日期的问题,可以生成一个与任何日期匹配的模式(因为只有8个日期,如果您想查找的话,它不会太大)在过去一年中可能效果不佳):
for d in 7 6 5 4 3 2 1 0
do
pattern="${pattern:+${pattern}\\|}$(date --date "${d} days ago" +%m%d%y)"
done
grep "^\\(${pattern}\\)" abc.log