awk / bash сравнить временную метку и сортировать разницу во времени по строке - PullRequest
1 голос
/ 09 января 2020

У меня есть такой файл журнала:

2019-10-15 13:35:46.823 INFO : xxx
2019-10-15 13:35:46.886 INFO : yyy
2019-10-15 13:35:46.943 INFO : zzz
2019-10-15 13:35:47.822 INFO : aaa
2019-10-15 13:35:48.824 INFO : bbb

Мне нужно выяснить разницу во времени (в мс) между отметкой времени для последовательных строк и отсортировать по разнице во времени (первая строка игнорируется)

 2019-10-15 13:35:46.823 1571117746823
 2019-10-15 13:35:48.824 1002
 2019-10-15 13:35:47.822 879
 2019-10-15 13:35:46.886 63
 2019-10-15 13:35:46.943 57

Я могу сделать это, написав сценарий bash, например

lastEpoch=0
while read p; do
  logTime=$(echo $p | cut -c1-24)
  currentEpoch=$(date -d "$logTime" +%s%3N)
  log="$log $logTime$((currentEpoch-$lastEpoch))"$'\n'
  lastEpoch=$currentEpoch  
done < my.log
echo -e "$log" > tmp.log
sort -nrk3 tmp.log

, но запуск сценария занимает очень много времени, так как мои исходные файлы журналов имеет 1M строк, и я думаю, что я не использую самый эффективный способ сделать это

Я думаю, что awk может сделать это эффективно, но я новичок в awk, может кто-нибудь подсказать мне, как это сделать на AWK ..? или есть более эффективный способ?

Ответы [ 2 ]

1 голос
/ 09 января 2020

Не могли бы вы попробовать следующее.

awk -F' INFO|: ' '
{
  split($1,array,"[- :.]")
  current=mktime(array[1] " " array[2] " " array[3] " " array[4] " " array[5] " " array[6]) * 1000 + array[7]
  print $1,$2,current-prev
  prev=current
}
' Input_file  | sort -r -nk3
1 голос
/ 09 января 2020

Вы можете сделать это в bash и преобразовать даты с while read l oop и date, чтобы преобразовать дату в секунды, затем вычесть ее из предыдущего значения и распечатать. Но, как вы обнаружили, вызов date для каждой строки очень и очень медленный.

Разницу можно вычислить в awk с помощью функции mktime, но сначала нужно преобразовать в формат mktime можно кушать. Тогда сортируй.

awk '{
    match($1 " " $2, /([0-9]+)-([0-9]+)-([0-9]+) ([0-9]+):([0-9]+):([0-9]+)\.([0-9]+)/, t)
    now = mktime(t[1] " " t[2] " " t[3] " " t[4] " " t[5] " " t[6]) * 1000 + t[7] 
    diff = now - prev
    prev = now
    print $1 " " $2 " " diff
}' | sort -r -n -k3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...