从文件底部开始搜索两个时间戳之间的字符串

从文件底部开始搜索两个时间戳之间的字符串

我试图Cannot proceed: the cube has no data在昨天下午 22:30 到今天上午 00:30 的时间戳之间找到一个巨大的 test.txt 文件中的字符串。

脚本:

tac test.txt | awk -v today=$(date "+%d") -v yesterday=$(date "+%d" -d yesterday) '/Cannot proceed: the cube has no data/ {f=$0; next} f{if (($3==yesterday && $4>"22:30:00") || ($4==today && $4<="00:30:00")) {print; print f} f=""}'

测试.txt:

[Thu Jun  8 07:56:17 2014]Local/data///47480280486528/Info(1019022)
Writing Database Mapping For [data]

[Thu Jun  8 12:56:38 2014]Local/data///47480280486528/Info(1250008)
Setting Outline Paging Cachesize To [8192KB]

[Thu Jun  8 22:56:20 2014]Local/data///47480280486528/Info(1013202)
Cannot proceed: the cube has no data 

[Thu Jun  8 23:26:18 2014]Local/data///47480280486528/Info(1013205)
Received Command [Load Database]

[Thu Jun  9 00:16:23 2014]Local/data///47480280486528/Info(1019018)
Writing Parameters For Database 

[Thu Jun  9 00:21:20 2014]Local/data///47480280486528/Info(1013205)
Writing Parameters For Database 

[Thu Jun  9 00:29:00 2014]Local/data///47480280486528/Info(1013205)
Cannot proceed: the cube has no data

[Thu Jun  9 01:25:21 2014]Local/data///47480280486528/Info(1019018)
Cannot proceed: the cube has no data 

输出:

[Thu Jun  8 22:56:20 2014]Local/data///47480280486528/Info(1013202)
Cannot proceed: the cube has no data

为什么不是所有符合要求的字符串都会出现在输出中?我在这里缺少什么?

答案1

我不熟悉awk,因此无法提供有关其操作的具体建议,但我相当确定这会起作用:

tac ./file |
sed -e "/$(date -d"2 days ago")/q" -e \
    '/Cannot proceed: the cube has no data/!d;h;n;G'

如果您像这样向后读入文件,tac那么您的目标错误应该首先出现,后面跟着日期线。因此,它h会在遇到目标后旧行最后一行,拉入下一行并将最后一行附加到末尾 - 有效地重新排序它们。

d删除所有其他行。

它会继续此搜索,直到遇到 2 天前的日期,此时它就q适合了。

相关内容