如何在Unix中的两个日期范围之间复制日志

时间:2019-06-28 10:27:17

标签: linux unix

我有一个日志文件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%y062019(追溯7天)
  • date +%m%d%y062719(当前日期)

任何建议如何实现?

2 个答案:

答案 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
  1. 使用strftime "%y%m%d"以big-endian格式获取日期范围的结尾(允许按字典顺序进行比较)。
  2. 使用正则表达式将每行中的日/月/年提取为单独的变量。
  3. 将当前行的重新排列的日期字段与范围的末端进行比较,以确定是否打印该行。

答案 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