Как я могу обрабатывать строки даты в bash? - PullRequest
1 голос
/ 01 августа 2020

Кто-нибудь знает, как я могу обрабатывать ввод, подобный этому, с помощью bash? Я хочу преобразовать абсолютное время в относительное. Мой подход работает, но ОЧЕНЬ запутан. Кто-нибудь может сделать лучше? Есть ли более чистый способ сделать это?

Ввод:

| 2020-08-01 15:35:47.446 | message 1                    |
| 2020-08-01 15:35:48.446 | hi these                     |
| 2020-08-01 15:31:47.446 | do stuff now!                |

Выход: Показывает разницу во времени в миллисекундах

0  message 1 
1000  hi these
60000  do stuff now!

Рабочий (очень грязный) подход :

while read line;
do echo $(echo "$(echo "$line" | cut -d' ' -f3 | cut -d':' -f2 | head -1) * 60000 + $(echo "$line" | cut -d' ' -f3 | cut -d':' -f3  | head -1) * 1000 - $baseval" | bc) $(echo "$line" | cut -d'|' -f3) ;
done < file.log

1 Ответ

0 голосов
/ 02 августа 2020

Похоже, в вопросе предлагается переместить серию временных меток abs в относительные метки времени, используя 'baseval' в качестве нулевой точки времени.

Можно использовать команду date (используя '+% S 'чтобы получить секунды прошедшей эпохи), чтобы упростить вычисление. Если в файле много строк, это решение может быть не идеальным, поскольку оно вызывает процесс 'date' для каждой строки.

Стоит отметить, что некоторые сложности связаны с синтаксическим анализом входного формата - комбинация фиксированных + разделенных столбец. Код использует bash IFS для разделения строки на компоненты.

#! /bin/bash

function relative_time_ms {
    # Convert inputinto two tokens - relative seconds + nanoseconds
    local dd=($(date '+%s %N' -d "$1"))
    echo $((dd[0]*1000 + dd[1]/1000000 - baseval))
}

while IFS='|' read x ts msg ; do
    rel_time=$(relative_time_ms "$ts")
    echo "$rel_time | $msg"
done < file.log

Вывод:

0 |  message 1                    
1000 |  hi these                     
-240000 |  do stuff now! 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...