Значение файла журнала разбора Bash и отметка времени двух строк под ним - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть файл в следующем формате:

[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 ]

1 голос
/ 06 ноября 2019

Это, я думаю, выполнит то, что вы ищете, используя 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
1 голос
/ 06 ноября 2019

что-то вроде этого будет работать, возможно, не будет достаточно надежным для всех случаев, так как ваш выборочный ввод очень ограничен ...

$ 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
...