Преобразование времени на языке зулу из файла в формат -> 2020.08.17 15:53

#linux #bash

#linux #bash

Вопрос:

Я должен преобразовать время на языке зулу в файле в формат -> 2020.08.17 15:53. Похоже, я близок, но не могу взломать его.

Файл данных

 [naveen@oc0663726888 BigFix_API]$ cat test_bkp.csv 
2020-08-17T15:53:31Z;Networking.NET-RUN;Sun;1.0;null;BFI Client
2019-01-25T10:57:22Z;OpenSSL;OpenSSL Project;1.0;null;BFI Client
2020-08-17T15:53:31Z;OpenSSL;OpenSSL Project;1.0;null;BFI Client
2019-01-25T10:57:22Z;Red Hat Enterprise Linux Server;RED HAT;6.9;null;BFI Client
2020-08-17T15:53:31Z;Red Hat Enterprise Linux Server;RED HAT;7.4;null;BFI Client
2020-08-17T15:57:31Z;Networking.NET-RUN;Sun;1.0;null;BFI Client
2020-08-17T15:57:31Z;OpenSSL;OpenSSL Project;1.0;null;BFI Client
2020-08-17T15:40:37Z;Networking.NET-RUN;Sun;1.0;null;BFI Client
2020-08-17T15:57:31Z;Red Hat Enterprise Linux Server;RED HAT;7.4;null;BFI Client
  

Пример рабочей команды

 date -u  %Y.%m.%d" "%H:%M -d "2020-08-17T15:53:31Z"
  

Режим сбоя

 [naveen@oc0663726888 BigFix_API]$ awk ' { A=$1";"$2;system("date -u  %Y.%m.%d" "%H:%M -d ""A""");} ' test_bkp.csv
date: invalid date ‘2020-08-17T15:53:31Z;Networking.NET-RUN;Sun;1.0;null;BFI;Clientr’
date: invalid date ‘2019-01-25T10:57:22Z;OpenSSL;OpenSSL;Project;1.0;null;BFI’
date: invalid date ‘2020-08-17T15:53:31Z;OpenSSL;OpenSSL;Project;1.0;null;BFI’
date: invalid date ‘2019-01-25T10:57:22Z;Red;Hat’
date: invalid date ‘2020-08-17T15:53:31Z;Red;Hat’
date: invalid date ‘2020-08-17T15:57:31Z;Networking.NET-RUN;Sun;1.0;null;BFI;Clientr’
date: invalid date ‘2020-08-17T15:57:31Z;OpenSSL;OpenSSL;Project;1.0;null;BFI’
date: invalid date ‘2020-08-17T15:40:37Z;Networking.NET-RUN;Sun;1.0;null;BFI;Clientr’
date: invalid date ‘2020-08-17T15:57:31Z;Red;Hat’
  

Комментарии:

1. Ваше требование заключается только в использовании bash и date ? Или вы можете использовать python, perl и т.д.?

2. Привет, Кевин, хорошо, что в bash есть еще необходимость запускать несколько заданий cron. Если не bash, то perl также может помочь. Спасибо.

3. Также: смотрите unix.stackexchange.com/questions/107750 /…

4. с помощью приведенной ниже команды удалось разобраться, спасибо за вашу поддержку. awk -F ‘;’ ‘{printf(«%s;%s;%s;%s;%s;%s;$s;»,$1,$2,$4,$5,$6,$7,$8); система(«date -u -d «$3″ %Y.%m.%d» «%R»);}’ test.csv > test2.csv

5. @user14129025 Каким образом использование perl / python / etc. Мешает вам использовать cron?

Ответ №1:

Предполагая, что идея заключается в том, что можно переформатировать с помощью date (в противном случае, как отметил Сайрус, просто удалите ненужные символы), вот один из подходов:

 awk -F';' -v OFS=';' ' $1 { cmd="date -u  "%Y.%m.%d %H:%M" -d "$1; while (( cmd | getline $1) > 0) {print;} close(cmd);}' test_bkp.csv
  

Объяснение

 -F';' -- field separator for parsing
OFS=';' -- output field separator
$1 -- ensures there is a line to process (i.e., blank lines skipped)
cmd=... -- set the command to execute
while (( ... )) -- use subshell to read line; the first field is re-assigned
print -- outputs the line (with the substituted first field)
close(cmd) -- close the command to avoid file handle issues
  

Вывод

 2020.08.17 15:53;L1;Networking.NET-RUN;Sun;1.0;null;BFI Client
2019.01.25 10:57;L2;OpenSSL;OpenSSL Project;1.0;null;BFI Client
2020.08.17 15:53;L3;OpenSSL;OpenSSL Project;1.0;null;BFI Client
2019.01.25 10:57;L4;Red Hat Enterprise Linux Server;RED HAT;6.9;null;BFI Client
2020.08.17 15:53;L5;Red Hat Enterprise Linux Server;RED HAT;7.4;null;BFI Client
2020.08.17 15:57;L6;Networking.NET-RUN;Sun;1.0;null;BFI Client
2020.08.17 15:57;L7;OpenSSL;OpenSSL Project;1.0;null;BFI Client
2020.08.17 15:40;L8;Networking.NET-RUN;Sun;1.0;null;BFI Client
2020.08.17 15:57;L9;Red Hat Enterprise Linux Server;RED HAT;7.4;null;BFI Client

 
  

Ответ №2:

Предположения:

  • все строки ввода начинаются с даты, которую необходимо изменить
  • нет необходимости конвертировать в другой часовой пояс (например, из зулусского в местное время)
  • мы можем усекать секунды (т. е. нет необходимости округлять секунды в большую / меньшую сторону до ближайшей минуты).

Дата / время (в файле), похоже, уже находятся в желаемом формате, за исключением небольшого редактирования …

  • замените - (дефис) на . (точка)
  • заменить T на (пробел)
  • удалите секунды / Z

… таким образом, нет необходимости вызывать date для переформатирования даты / времени.

Некоторые примеры данных:

 $ cat zulu.dat
2020-08-17T15:53:31Z;Networking.NET-RUN;Sun;1.0;null;BFI Client
2019-01-25T10:57:22Z;OpenSSL;OpenSSL Project;1.0;null;BFI Client
2020-08-17T15:53:31Z;OpenSSL;OpenSSL Project;1.0;null;BFI Client
2019-01-25T10:57:22Z;Red Hat Enterprise Linux Server;RED HAT;6.9;null;BFI Client
2020-08-17T15:53:31Z;Red Hat Enterprise Linux Server;RED HAT;7.4;null;BFI Client
  

Одно awk решение:

 awk -F";" '                       # input field separator = ";"
BEGIN {OFS=";"}                   # output field separator = ";"
      {gsub(/-/,".",$1)           # replace "-" with "." in field 1
       gsub(/T/," ",$1)           # replace "T" with " " (space) in field 1
       $1=substr($1,1,16)         # strip off ":<sec>Z" and re-assign to field #1
       print                      # print our newly formatted line
      }
' zulu.dat
  

Вышеуказанное генерирует следующее из файла примера:

 2020.08.17 15:53;Networking.NET-RUN;Sun;1.0;null;BFI Client
2019.01.25 10:57;OpenSSL;OpenSSL Project;1.0;null;BFI Client
2020.08.17 15:53;OpenSSL;OpenSSL Project;1.0;null;BFI Client
2019.01.25 10:57;Red Hat Enterprise Linux Server;RED HAT;6.9;null;BFI Client
2020.08.17 15:53;Red Hat Enterprise Linux Server;RED HAT;7.4;null;BFI Client