#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