Як я можу конвертувати часові позначки у стовпці на дату?


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тут. Будь ласка, уточніть, що НЕ ВСЕ АВК strftime()! Для рішення, яке працює в більшості (усіх?) AWK, будь ласка, скористайтеся зовнішньою dateкомандою, щоб залишатися переносними.

2
@yeti, є кілька dateреалізацій, які можуть конвертувати дати між форматами як розширення, але те, як це робиться, різниться між різними реалізаціями. Наприклад, рішення, яке надає Костас, використовує синтаксис, характерний для 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.