См. руководство gawk для strftime, оно не ожидает времени в любом формате, кроме секунд с начала эпохи. Если бы у gawk была str p time () THEN, это сработало бы, но это не сработало (и Я не могу убедить сопровождающих предоставить один ), поэтому вам нужно помассировать метка времени в формат, который mktime () может преобразовать в секунды, а затем передать TH в strftime (), например:
$ awk '{
split($4,t,/[[\/:]/)
old = t[4] " " (index("JanFebMarAprMayJunJulAugSepOctNovDec",t[3])+2)/3 " " t[2] " " t[5] " " t[6] " " t[7];
secs = mktime(old)
new = strftime("%d-%m-%Y %T",secs);
print $4 ORS old ORS secs ORS new
}' file
[28/Mar/2019:11:43:58
2019 3 28 11 43 58
1553791438
28-03-2019 11:43:58
но, конечно, вам вообще не нужны mktime () или strftime () - просто перетасуйте компоненты даты вокруг:
$ awk '{
split($4,t,/[[\/:]/)
new = sprintf("%02d-%02d-%04d %02d:%02d:%02d",t[2],(index("JanFebMarAprMayJunJulAugSepOctNovDec",t[3])+2)/3,t[4],t[5],t[6],t[7])
print $4 ORS new
}' file
[28/Mar/2019:11:43:58
28-03-2019 11:43:58
Это будет работать в любом awk, а не только в GNU awk, поскольку оно не требует функций времени.
index("JanFebMarAprMayJunJulAugSepOctNovDec",t[3])+2)/3
- это просто идиоматический способ преобразования трехмесячной аббревиатуры названия месяца (например, Mar
) в эквивалентный номер месяца (3
).