Bash解析日志文件值,并在下面两行加上时间戳

Bash解析日志文件值,并在下面两行加上时间戳,bash,parsing,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] Fe

我有以下格式的文件:

[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来实现这一点,但由于我无法重用该值并将其回送到文件中,因此没有真正取得任何进展。

类似的方法可能会奏效,可能不会对所有情况都足够健壮,因为您的示例输入非常有限

$ 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

$awk'{for(i=1;i类似的东西可以工作,可能不适合所有情况,因为您的示例输入非常有限

$ 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

$awk'{for(i=1;i我认为这将实现您使用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

我认为这将实现你所期待的使用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

谢谢,我添加了另一个示例行谢谢,我添加了另一个示例行