我试图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
适合了。