Use Sed Regex Capture Group в Методе Раздела Замены

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

2
07.08.2018, 04:23
2 ответа

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

Давайте проигнорируем тот факт, что у вас есть имена файлов в текстовом файле, и вместо этого предположим, что у вас есть прямой доступ к файлам в каком-то каталоге $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.

1
27.01.2020, 22:17

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

cat files

  • ..._201807010112.log

  • ..._201807010132.log

  • ..._201807010152.log

  • ..._201807010202.log

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

ГГГГ -мм -дд ЧЧ :СС с использованием этого регулярного выражения с 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.

1
27.01.2020, 22:17

Теги

Похожие вопросы