Использовать 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!' 

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

  • Когда был открыт последний файл?
  • Задача Cron для удаления файлов старше 3 дней
  • Команда ls без (скрытия) даты и времени
  • Универсальная альтернативная альтернатива non-bash `time`?
  • Как удалить файлы в одной папке, которая старше 60 дней в UNIX?
  • Получить последний каталог (не последний файл)
  • Удалить последний измененный файл
  • Как мне выполнить ls, а затем отсортировать результаты по дате?
  • Получить дату изменения, которую можно использовать с touch -m
  • Как скопировать 5 новейших файлов из одного каталога в другой и удалить старые копии
  • Как найти последние n новых файлов для каждой из нескольких каталогов
  • Linux и Unix - лучшая ОС в мире.