Мой ввод [10/04/16 01:02:03 BST]
.Как я могу преобразовать в Apr 10 16 01:02:03
?
И я не хочу заменять /
на -
.
2 ответа
В зависимости от вашей версии date
(системы, основанные на GNU), это поможет.
date -jf '[%d/%m/%y %T BST]' '[10/04/16 01:02:03 BST]' +'%b %d %g %T'
Недопустимые даты или время, например недопустимый день или недопустимый месяц, вызывают ошибку. Поэтому это не сработает.
date -jf '[%d/%m/%y %T BST]' '[10/13/16 01:02:03 BST]' +'%b %d %g %T'
Дни после конца месяца проливаются на следующий месяц, так что это "завершение" к 02 марта 16 01:02:03.
date -jf '[%d/%m/%y %T BST]' '[31/02/16 01:02:03 BST]' +'%b %d %g %T'
Использование awk:
$ echo '[10/04/16 01:02:03 BST]' | awk -F'[][/: ]' 'BEGIN{split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec",m,/ /)} {print m[$3+0],$2,$4,$5":"$6":"$7}'
Apr 10 16 01:02:03
Как это устроено
-F'[][/: ]'
Это устанавливает разделитель полей любому из
[
/
или пустым.BEGIN{split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec",m,/ /)}
Это определяет массив
m
который содержит названия месяцевprint m[$3+0],$2,$4,$5":"$6":"$7
Это распечатывает дату в новом формате.
Альтернативный ввод с обратной косой чертой
Если во входных данных есть обратная косая черта, мы можем игнорировать их, добавив обратную косую черту в наш список разделителей полей:
$ echo '\[10\/04\/16 01:02:03 BST\]' | awk -F'[][/: \\\\]+' 'BEGIN{split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec",m,/ /)} {print m[$3+0],$2,$4,$5":"$6":"$7}'
Apr 10 16 01:02:03