Преобразование/замена времени из миллисекунд эпохи в удобочитаемую дату в лог-файлах

Вы можете использовать настройки прокси в Firefox. Здесь я предположил, что ваша локальная сеть — 192.168.122.0/24, но вы должны адаптировать ее к своему случаю.

Firefox proxy settings

1
05.12.2020, 16:41
2 ответа

Это не то, что вы можете сделать с помощью команды bash, вам нужна внешняя программа, так как bash не может выполнять математические операции с плавающей запятой и не может обрабатывать даты. Я подозреваю, что вы просто имели в виду «в командной строке», и вам на самом деле не требуется чистое решение bash. Исходя из этого предположения, вот решениеgawk(GNU awk ):

$ gawk '{$1=strftime("%d.%m.%Y %H:%m:%S",sprintf("%.3f", $1 /1000))}1;' file
02.04.2018 19:04:24 entity1,sometext
02.04.2018 19:04:41 entity2,sometext
02.04.2018 19:04:47 entity1,sometext

Функция strftimeпреобразует метку времени в дату. Так как у вас в миллисекундах, мы используем sprintf, чтобы преобразовать это в секунды. Окончательный 1;просто указывает gawkнапечатать строку после того, как мы присвоили новое значение$1(первому полю ).


Помните, что вывод будет зависеть от вашего часового пояса. Например, вышеописанное было запущено на машине с часовым поясом по Гринвичу. Вот почему мои числа отличаются от тех, что указаны в ответе @thanasisp , который, предположительно, был запущен в другом часовом поясе.Вы можете контролировать это и изменять вывод, устанавливая переменную TZпри выполнении команды. Например, сравните это:

$ gawk '{$1=strftime("%d.%m.%Y %H:%m:%d.%S",sprintf("%.3f", $1 /1000))}1;' file
02.04.2018 19:04:02.24 entity1,sometext
02.04.2018 19:04:02.41 entity2,sometext
02.04.2018 19:04:02.47 entity1,sometext

к этому:

$ TZ=America/Los_Angeles gawk '{$1=strftime("%d.%m.%Y %H:%m:%d.%S",sprintf("%.3f", $1 /1000))}1;' file
02.04.2018 11:04:02.24 entity1,sometext
02.04.2018 11:04:02.41 entity2,sometext
02.04.2018 11:04:02.47 entity1,sometext

Или это:

$ TZ=Asia/Tokyo gawk '{$1=strftime("%d.%m.%Y %H:%m:%d.%S",sprintf("%.3f", $1 /1000))}1;' file
03.04.2018 03:04:03.24 entity1,sometext
03.04.2018 03:04:03.41 entity2,sometext
03.04.2018 03:04:03.47 entity1,sometext
2
18.03.2021, 22:45

Если вы используете сценарий оболочки, читающий строку за строкой, или awkсистему вызова сценариев date, это будет очень медленно, слишком много процессов. Вы должны использовать простой скрипт на awk, Perl, Python или что-то в этом роде. Все языки имеют стандартные функции даты и времени для преобразования между форматами.

Здесь и здесь — несколько хороших ссылок. Если вы хотите использовать функции времени GNUawkи strftime(), все, что вам нужно для вашего случая, это выбрать подстроку эпохи, исключая миллисекунды :

.
$ awk '{$1 = strftime("%F %T", substr($1,1,10))} 1' file
2018-04-02 21:25:24 entity1,sometext
2018-04-02 21:25:41 entity2,sometext
2018-04-02 21:25:47 entity1,sometext

Или печатать миллисекунды вместе:

$ awk '{$1 = strftime("%F %T", substr($1,1,10)) "." substr($1,11)} 1' file
2018-04-02 21:25:24.403 entity1,sometext
2018-04-02 21:25:41.466 entity2,sometext
2018-04-02 21:25:47.273 entity1,sometext

Или для печати дня -месяца -Формат года:

$ awk '{$1 = strftime("%d-%m-%Y %T", substr($1,1,10))} 1' file
02-04-2018 21:25:24 entity1,sometext
02-04-2018 21:25:41 entity2,sometext
02-04-2018 21:25:47 entity1,sometext
4
18.03.2021, 22:45

Теги

Похожие вопросы