Канал в файл журнала с сегодняшней датой, содержащейся в имени файла

Чрезвычайно глупо пытаться анализировать вывод команды ls , который не предназначен для анализадля передачи команды, которая не предназначена для работы с несколькими символами(например: новые строкии {}), когда оболочка делает это сама:

set -- *; for f; do echo "<$f>"; done

set    -- *
for    f
do     ls "$f"
done

Или в одной командной строке:

$ set -- *; for f; do echo "<$f>"; done

<-name-with-dash-prefix>





Обратите внимание, что вывод работает (и имеет n примеров в качестве последнего имени файла) с символами новой строки.

Или, если количество файлов делает оболочку медленной, используйте find:

$ find ./ -type f -exec echo '<{}>' \;
<./safe-name>
<./with_a
newline>
<./name-with-double-quote">
<./-name-with-dash-prefix>
<./name with space>
<./name-with-single-quote'>
<./name-with-backslash\>

Только учтите, что find обрабатывает все точечные файлы и все подкаталоги иначе, чем оболочка.

1
17.02.2017, 13:06
2 ответа

Я использовал способность Awk оценивать конструкцию имени файла, включая сегодняшнюю дату, при каждой оценке (для каждой строки, которая происходит из журнала) и в итоге получил:

tail -F mylatestlogfile.log | grep "ERROR" | awk '{print >> "/tmp/myerrors/errors." strftime("%Y-%m-%d") ".log"}'
0
28.01.2020, 01:00

Вы можете попробовать следующий код в качестве скрипта bash :

#!/bin/bash

while getopts "d:f:e:r:a" opt; do
    case $opt in
        f) FDATE=$(awk -v fmt="$OPTARG" '{print strftime(fmt)}'<<<DUMMY) ;;
        r) PREFIX="$OPTARG" ;;
        e) SUFFIX="$OPTARG" ;;
        d) DEST="$OPTARG" ;;
        a) APPEND=true ;;
    esac
done
if [ ! $APPEND ]
then
    > ${DEST}/${PREFIX}.${FDATE}.${SUFFIX}
fi
while read line; do echo ${line} >> ${DEST}/${PREFIX}.${FDATE}.${SUFFIX}; done

Вы также можете окружить тело скрипта:

pushtolog()
{
...
}

и источник.

Я также включил флаг, позволяющий добавлять к существующим данным. Должно быть легко изменить сценарий по умолчанию для добавления и перезаписи, когда задана конкретная опция.

Примечание 1 : формат даты должен соответствовать strftime (см. man strftime ), поэтому используйте «% Y-% m-% d»

Примечание 2 : эта переменная APPEND на самом деле не является логическим значением, я просто предполагаю, что это так. Возможно, лучше использовать APPEND = "true" и , если [-z "$ APPEND"]

0
28.01.2020, 01:00

Теги

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