Используйте Sed Regex Capture Group в методе Replace Section

У меня есть список имен файлов с метками времени в следующем формате:

cat files 
  • .. 201807010112 .log
  • .. 201807020112 .log
  • .. 201807022359 .log
  • .. 201807030112 .log
  • .. 201807010412 .log

Мне нужно получить определенный диапазон, и для этого я бы хотел использовать SED.

 sed -n '/201807010112/,/201807030112/p' 

Это была моя первая попытка, но sed странно относится к часам и минутам, и, говоря коротко, он не может правильно понять этот формат.

Возможно, я засеяю сорняками, но для решения этой проблемы я решил преобразовать формат во что-то, что понимает SED.

 cat files | sed -e "s/\([0-9]\{12\}\}/$(date -f '%Y%m%d%H%M' \1)/g" 

Моя проблема в том, что я не могу использовать результат совпадения \ 1 в блоке преобразования даты.

Есть ли способ сделать это или еще лучше, чтобы получить диапазон дат?

В вашем вопросе говорится, что вам нужно получить имена некоторых файлов журнала в определенном диапазоне дат.

Давайте не будем учитывать тот факт, что у вас есть имена файлов в текстовом файле, и вместо этого предположим, что у вас есть прямой доступ к файлам в некотором каталоге $logdir .

Формат имени файла: *_YYYYMMDDhhmmss.log где конечный бит – стандартная строка метки времени.

Чтобы получить файлы между *_201807010112.log и *_201807030112.log в цикле (чтобы что-то сделать с каждым из них), используйте (в bash ),

 process_flag=0 for pathname in "$logdir"/*_??????????????.log do if [ "$process_flag" -eq 0 ]; then if [[ "$pathname" == *_201807010112.log ]]; then process_flag=1 else continue fi fi # Do some sort of processing of # the logfile in "$pathname" here. # When done... if [[ "$pathname" == *_201807030112.log ]]; then break fi done 

Этот цикл проходит по всем файлам журналов, которые имеют похожий формат имени файла. Цикл будет перебирать имена путей в лексикографическом порядке. Предполагается, что все файлы имеют одинаковый префикс имени файла (вы ничего не говорите об этом).

Первая часть цикла обнаруживает первый файл в диапазоне и устанавливает для параметра process_flag значение 1 когда этот файл найден. Установка для process_flag 1 позволяет циклу войти в средний бит, где вы фактически используете "$pathname" для любой обработки этого файла, которую вам нужно выполнить.

Перед продолжением следующей итерации последний оператор if проверяет, соответствует ли текущий $pathname последнему файлу, который мы хотели обработать. Если это так, цикл заканчивается оператором break .

Поэтому я решил не пытаться использовать функцию даты для преобразования формы и вместо этого использовать больше САС!

кошачьи файлы

  • …_ 201807010112.log

  • …_ 201807010132.log

  • …_ 201807010152.log

  • …_ 201807010202.log

Дата в формате ГГГГммдДЧЧ, и я преобразовал ее в следующий формат:

ГГГГ-мм-дд ЧЧ: СС с использованием этого выражения регулярного выражения с SED.

 cat files | sed -e 's/\(_[0-9]\{4\}\)\([0-9]\{2\}\) \ \([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\) \/\1-\2-\3 \4:\5/g' 

Далее оттуда был кусок пирога, чтобы указать диапазон, основанный на дате.

  | sed -n '/2018-07-01 01:20/,/2018-07-02 02:01/p' 

Самым большим отрывом для меня было знание правильного формата даты и времени, чтобы использовать опцию шаблона диапазона SED.