Как я могу преобразовать метки времени в столбце в дату?


15

У меня есть файл, содержащий это:

1415602803,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22
1415602807,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22
1415602811,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22
1415602815,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22

Я хочу преобразовать отметку времени в дату в этом формате:

2014-11-10 02:00:03,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22
2014-11-10 02:00:07,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22
2014-11-10 02:00:11,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22
2014-11-10 02:00:15,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22

Как я могу это сделать?

Я знаю, что это работает: perl -pe 's/(\d+)/localtime($1)/e'(из этого вопроса ), но выходной формат Mon Nov 10 02:00:03 2014.

Я знаю, что эта команда может конвертировать метки времени в желаемый результат:, date -d@1415602803 +"%F %H:%M:%S"но я не мог заставить ее работать с awkиспользованием system("cmd")из-за всех цитат и еще много чего.

Ответы:


6

Как это возможно

perl -pe 'use POSIX qw(strftime); s/^(\d+)/strftime "%F %H:%M:%S", localtime($1)/e' 

17

Нашел что-то здесь: Stackoverflow - конвертировать из unixtime в командной строке .

Придумали это:

awk -F"," '{OFS=","; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' file
  • -F","использовать разделитель полей ,,
  • OFS=",";так что выходные поля также разделены ,,
  • $1=strftime("%Y-%m-%d %H:%M:%S", $1);изменить значение первого поля $1в указанном формате, и
  • print $0; напечатать всю строку.

2
awk 'BEGIN{ print strftime("%Y-%m-%d %H:%M:%S", 0) }'дает awk: line 2: function strftime never definedздесь. Пожалуйста, уточните, что НЕ КАЖДЫЙ AWK имеет strftime()! Для решения, работающего в большинстве (всех?) AWK, используйте внешнюю dateкоманду, чтобы оставаться переносимым.

2
@yeti, есть несколько dateреализаций, которые могут преобразовывать даты между форматами как расширение, но как это делается, полностью зависит от реализации. Например, решение, данное Costas, использует синтаксис, специфичный для GNU date. Если вы хотите мобильности, используйте perl.
Стефан Шазелас

4

Если вам нравится, awkвы можете использовать внешние команды dateс любыми форматами даты

awk -F, -v OFS="," '{("date +%F\ %T -d @"$1)|getline $1}1'

+1 за НЕ использовать strftime()!

4
Обратите внимание, что использование внешней команды приведет к серьезному снижению производительности, особенно это заметно, если обрабатывается много тысяч строк
Хосе Гомес,

2

Вы также можете попробовать:

cat test.txt | sed 's/^/echo "/; s/\([0-9]\{10\}\)/`date -d @\1`/; s/$/"/' | bash

2

Я задал вопрос 9 месяцев назад, который был отмечен как дубликат этого. Я только сейчас увидел просьбу опубликовать ответ, который работал для меня на этот вопрос. Вот ссылка на этот вопрос и ответ.

/unix//a/304009/172916

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.