Как оказалось, он не запускался, потому что одно из правил касалось HD, который не был смонтирован при запуске. Монтирование и перезапуск lsyncd помогли.
В вашем вопросе говорится, что вам нужно получить имена некоторых файлов журналов в определенном диапазоне дат.
Давайте проигнорируем тот факт, что у вас есть имена файлов в текстовом файле, и вместо этого предположим, что у вас есть прямой доступ к файлам в каком-то каталоге $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
.
Поэтому я решил не пытаться использовать функцию 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.