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
谢谢,我添加了另一个示例行谢谢,我添加了另一个示例行