Bash解析日志文件的值和时间戳下面的两行

时间:2019-11-05 22:21:44

标签: bash parsing

我的文件格式如下:

[2019-11-03 02:23:16] DEBUG : [COST METRICS] Found 10927 cost entries to copy.
[2019-11-03 02:23:16] DEBUG : [COST METRICS] Copying relevant cost data over via query: [..sql query here...]
[2019-11-03 02:25:13] DEBUG : [REVENUE METRICS] Fetching count of groups to be updated...
--
[2019-11-03 02:45:09] DEBUG : [COST METRICS] Found 4970 cost entries to copy into new table A_294472
[2019-11-03 02:45:09] DEBUG : [COST METRICS] Copying relevant cost data over via query: [..sql query here..]
[2019-11-03 02:45:15] DEBUG : [REVENUE METRICS] Fetching count of groups to be updated

以上格式在文件中重复多次。 我想要得到的是要更新的成本条目数,该日志行的时间戳以及下面两行的时间戳(这是查询将完成并且脚本移至下一个任务的时间) 。所以我想要的输出是:

Number   Start      Finish
10927    02:23:16   02:25:13

如果可能的话,甚至在此情况下,甚至还会有一个计时列显示 00:01:57 。 我正在尝试使用grep和egrep来实现这一点,但是由于无法重用该值并将其回显到文件中,因此并没有真正实现目标。

2 个答案:

答案 0 :(得分:1)

像这样的事情可能会奏效,因为您的示例输入非常有限,所以可能无法在所有情况下都足够强大...

$ awk '{for(i=1;i<=NF;i++) 
           if($i=="Found") {t=$2; sub("]","",t); v=$(i+1); n=NR; next}} 
   t && NR==n+2 {sub("]","",$2); print v,t,$2; t=""}' file

10927 02:23:16 02:25:13

答案 1 :(得分:1)

我认为这可以使用egrep和awk完成您想要的

egrep -A2 "^\[[0-9]{4}-[0-9]{2}-[0-9]{2}\s[0-9]{2}:[0-9]{2}:[0-9]{2}\].*\[COST METRICS\] Found" test.txt | grep -v '\-\-' | awk '{ORS="\n"} NR==1 {print "Number  Start     Finish" }; {ORS=""} NR%3==1 {print $8"   "substr($2,0,8)} NR%3==0 {print "  "substr($2,0,8)"\n" }'

其中test.txt是您的日志文件

示例输出:

Number  Start     Finish
10927   02:23:16  02:25:13
10927   02:25:16  02:25:16
55097   02:28:16  02:29:13
66927   02:29:16  02:30:15
77927   02:31:16  02:31:18