我的文件格式如下:
[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来实现这一点,但是由于无法重用该值并将其回显到文件中,因此并没有真正实现目标。
答案 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