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

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' 
Marki
источник
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
kayn
источник
2

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

/unix//a/304009/172916

Эмили Шаффер
источник