Как скопировать журнал резервного копирования?

read -r -p 'Enter pattern: ' pattern

result=$( grep -e "$pattern" records )

if [ -n "$result" ]; then
    printf '%s\n' "$result"
else
    printf 'No match found for pattern "%s"\n' "$pattern"
fi
  • Присвоениеsearch(resultв моем коде )лучше всего выполнять вне оператора if.

  • Проверка с помощью-n("эта строка не -пуста?" )о результате.

  • Не заключайте переменную (в одиночные -кавычки, это не позволит оболочке расширять ее значение ). Вместо этого двойная цитата.

  • Обратите внимание на «шаблон», а не на «ключевое слово». То, как вы используете grepздесь, будет использовать предоставленную пользователем -строку как регулярное выражение (шаблон, такой как cat.*dog), не обязательно как простую фиксированную строку.

  • catследует использовать для объединения файлов, в большинстве других случаев это более или менее бесполезно.

  • Используйте read -r, чтобы разрешить пользователю вводить обратную косую черту.


В качестве альтернативы:

read -r -p 'Enter pattern: ' pattern

if ! grep -e "$pattern" records; then
    printf 'No match found for pattern "%s"\n' "$pattern"
fi

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

Относительно использования printfвместоecho:Почему printf лучше, чем echo?


Более короткий, с использованием короткой -цепи ИЛИ.

read -r -p 'Enter pattern: '

grep -e "$REPLY" records ||
printf 'No match found for pattern "%s"\n' "$REPLY"
0
14.10.2019, 16:28
1 ответ

Вы можете просто перенаправить вывод в файл и $(date...)как часть имени файла.

напр.:

/path/to/backup_script.sh > /path/to/log/backup_$(date +%F).log

или то же самое в скрипте:

rsync -av... > /path/to/log/backup_$(date +%F).log
0
28.01.2020, 03:11

Теги

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