Использовать awk для печати и редактирования даты

Я ищу однострочную команду для получения желаемого результата. Обычный текст выглядит так: «test_list_20160915_bla.log» Желаемый вывод: «2016/09/15»

Я мог бы сделать это с помощью двух команд awk (я знаю, что команда печатает только год, это просто для этой цели):

echo "test_list_20160915_bla.log" |awk -F_ '$3 ~ /[0-9]/ {print $3}' |awk 'BEGIN {OFS="/"} {print substr($1,1,4)}' 

Но как я могу использовать это в команде 1? Является ли awk правильным инструментом? Возможно, sed мог бы сделать то же самое, но я больше знаком с awk.

У меня есть проблемы с предоставленным решением. Иногда у нас есть файлы вроде: «test_20161205145213.log». С командой sed мой вывод будет выглядеть как «2051/45/21», что довольно плохо. Пробовал несколько вещей, но я не могу понять.

Включено

  sed -r 's!^.*_([0-9]{4})([0-9]{2})([0-9]{2})_.*$!\1/\2/\3!' 

в

  sed -r 's!^.*(20[0-9]{2})([0-9]{2})([0-9]{2}).*$!\1/\2/\3!' 

Это ограничивает выходы ошибки на отметки времени с часом 2. Я бы предпочел полностью игнорировать имя файла и только перейти к отметке времени в нем.

Временной меткой может быть yyymmdd_hhmmss или yyymmddhhmsms. Мне просто нужна часть yyyy / mm / dd. Проблема в том, что не существует фиксированной длины или разделителя поля.

One Solution collect form web for “Использовать awk для печати и редактирования даты”

Вы можете нарезать и кубиком в том же скрипте awk :

 echo "test_list_20160915_bla.log" | awk -F_ '$3 ~ /^[1-9][0-9]*$/ { print substr($3,1,4) "/" substr($3,5,2) "/" substr($3,7,2) }' 

Здесь мы просто извлекаем группы цифр года, месяца и дня из третьего поля «_» и разделяем их.

Или с sed , который также отвечает вашим дополнительным требованиям:

 ( echo "test_list_20160915_bla.log" echo "test_20161205145213.log" ) | sed -r 's!^.*_([0-9]{4})([0-9]{2})([0-9]{2}).*$!\1/\2/\3!' 

Здесь мы используем регулярное выражение для записи трехзначных групп в течение года, месяца и дня, отбрасывания всего остального, а затем распечатываем три группы, к которым присоединяется / .

  • Продолжить загрузку, если временная метка не изменилась
  • Как изменить время BIRTH файла BSD (aka btime)?
  • Как найти последние n новых файлов для каждой из нескольких каталогов
  • Calc добавляет '(апостроф) при импорте времени из CSV
  • В Ubuntu - / var / log / messages отметки времени на 4 минуты вперед
  • Как получить приемлемую последнюю измененную временную метку для моего сайта Jekyll с помощью сценария оболочки?
  • Универсальная альтернативная альтернатива non-bash `time`?
  • Каков наиболее эффективный способ добавления миллисекунд к этому коду?
  • Получить строки между двумя временными метками из файла
  • Почему sudo timestamp не обновляется при установке NOPASSWD?
  • Изменение метки времени символической ссылки
  • Interesting Posts

    Свободное пространство, показывающее проблему в команде `parted`?

    Как запустить человека с форматированием в неинтерактивной оболочке?

    Почему не все пространство равно всем подразделам?

    Как регистрировать сообщения из модуля pam?

    Как переходить между процессами с именованными каналами?

    извлечь значение между двумя шаблонами поиска на одной строке

    Проблема фильтрации массива последовательностей для удаления дубликатов со сдвинутыми последовательностями

    Вывод сценария оболочки неправильно разбивается при передаче в качестве аргумента скрипту

    Что означает «размер в 512-байтных блоках»?

    Как установить возможности Linux, такие как setcap и getcap?

    путь к папке в папке в терминале

    Как войти в режим Erlang в Emacs?

    Предотвращать запуск определенных строк скрипта как root

    Как остановить xargs от плохо слияния вывода из нескольких процессов?

    Как я могу найти, какой пользователь обращается к файлу с помощью strace?

    Linux и Unix - лучшая ОС в мире.