2016-11-25 7 views
0

Я пытаюсь обработать файл журнала почты с помощью awk, но у меня есть проблема с преобразованием метки времени в формат UTC.Как преобразовать временную метку в UTC, используя AWK

Файл ввода выглядит следующим образом:

# cat /tmp/TimeStamps1.tmp 

2016-08-10T00:23:45.984558+02:00 
2016-09-30T10:23:45.984558+02:00 
2016-10-31T20:45:27.984558+01:00 

И ожидать выход должен быть:

cat /tmp/Target 

2016-08-09 22:23:45 
2016-09-30 08:23:45 
2016-10-31 19:45:27 

Как «T» между Дата & время кажется, вопрос, я также попытался удалить его :

# cat /tmp/TimeStamps2.tmp 

2016-08-10 00:23:45.984558+02:00 
2016-09-30 10:23:45.984558+02:00 
2016-10-31 20:45:27.984558+01:00 

Сначала попробуйте с помощью системы()

awk ' {print $1" - "system("date -u +%Y-%m-%d -d" $0) } ' /tmp/TimeStamps2.tmp 
date: extra operand `00:23:45.984558+02:00' 
Try `date --help' for more information. 
2016-08-10 - 1 
date: extra operand `10:23:45.984558+02:00' 
Try `date --help' for more information. 
2016-09-30 - 1 
date: extra operand `20:45:27.984558+01:00' 
Try `date --help' for more information. 
2016-10-31 - 1 

Второй попробовать использовать STRFTIME()

/tmp$ awk -F',' ' {print $1" - "strftime("%Y-%m-%d %H:%M:%S", $1)} ' /tmp/TimeStamps2.tmp 
2016-08-10 00:23:45.984558+02:00 - 1970-01-01 01:33:36 
2016-09-30 10:23:45.984558+02:00 - 1970-01-01 01:33:36 
2016-10-31 20:45:27.984558+01:00 - 1970-01-01 01:33:36 
+0

дата работает находку: дату -u +% Y-% m-% d»«% T -d "2016-08-10 00: 23: 45.984558 + 02: 00" 2016-08-09 22:23:45 – Fdv

+0

Нет проблем с использованием GAWK, strftime и mktime. Формат аргумента, ожидаемого mktime, представляет собой строку формы «YYYY MM DD HH MM SS [DST]». Я должен буду попытаться переформатировать соответственно, любое предложение для формата [DST]? – Fdv

+0

Это дает хорошие результаты: echo "2016-08-10 00: 23: 45.984558 + 02: 00" | awk -F ',' -v sep = \ "'{system (" date -u +% Y-% m-% dT-% T -d "sep $ 1 sep)}' 2016-08-09T-22 : 23: 45 У меня должен быть «T» в формате, это создает проблему. – Fdv

ответ

1

Это звучит теперь как это то, что вы на самом деле пытаетесь сделать:

$ cat file 
2016-08-10T00:23:45.984558+02:00 here is the first line 
2016-09-30T10:23:45.984558+02:00 and here's the second 
2016-10-31T20:45:27.984558+01:00 oh look, a third! 

$ awk '{ 
    ts=$1; sub(/T/," ",ts); sub(/[^ ]+ /,"") 
    cmd="date -u +\"%Y-%m-%d %T\" -d \"" ts "\"" 
    if ((cmd | getline line) > 0) { 
     print line, $0 
    } 
    close(cmd) 
}' file 
2016-08-09 22:23:45 here is the first line 
2016-09-30 08:23:45 and here's the second 
2016-10-31 19:45:27 oh look, a third! 
+1

Огромное спасибо, это именно то, что мне нужно, извините, что не закончил с самого начала. – Fdv

0

Это первый ответ, ТНХ Эд Мортон!

awk ' { A=$1" "$2;system("date -u +%Y-%m-%d\" \"%T -d \""A"\"" ); } ' TimeStamps2.tmp 
2016-08-09 22:23:45 
2016-09-30 08:23:45 
2016-10-31 19:45:27 
+0

Попробуйте '' date -u + \ "% Y-% m-% d% T \" -d \ "" A "\" "' вместо этого. Это более разумно/общепринято/читаемо для цитата целая строка, а не отдельные пробелы внутри нее: '' foo bar "' а не 'foo" "bar'. –

+0

Действительно, большое спасибо. Я заметил, что результат команды system() недоступен в awk сценарий, если я пытаюсь c переверните файл mail.log, в качестве вывода будет доступна только метка времени :( – Fdv

+0

Правильно, 'system (cmd)' не так, как вы это делаете, 'cmd | getline' есть. Это возвращает нас к одному из первых ваших комментариев, который должен был предоставить краткий, тестовый ввод проб и ожидаемый результат, чтобы мы могли помочь вам сделать то, что вы действительно пытаетесь сделать, а не просто помочь вам реализовать то, что вы думаете необходимо реализовать. –

Смежные вопросы