Мой ввод [10/04/16 01:02:03 BST] .Как я могу преобразовать в Apr 10 16 01:02:03? И я не хочу заменять / на - .

2 ответа2

1

В зависимости от вашей версии 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'
1

Использование 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .