Фильтрация вывода стандартных ошибок из удаленного репозитория BorgBackup

Я хочу отфильтровать стандартную ошибку для команды, которая выводит информацию о состоянии в стандартную ошибку. В данном случае Borg Backup. В частности, стандартный вывод borg check включает строки типа:

Checking segments ...

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

Я использовал подход, описанный Gilles. Это прекрасно работает, например, для локального хранилища Borg:

{ borg check '/media/faheem/My Passport/backup-Mail' 2>&1 1>&3 | tr '\r' '\n' | grep -v "^Checking segments" 1>&2; } 3>&1

Однако для удаленного хранилища ситуация немного другая. Вывод выглядит так

Remote: Checking segments 99.3% 
Remote:

Как можно изменить обратный grep, чтобы избавиться от обоих этих случаев?

{ borg check faheem@ramnode:/mnt/backup-Mail 2>&1 1>&3 | tr '\r' '\n' | grep -v ":Checking segments" 1>&2; } 3>&1

работает для первого случая, но не для второго, а именно просто Remote:. Я могу использовать два greps, но я бы предпочел одно выражение.

0
30.04.2016, 22:34
1 ответ

Чтобы отфильтровать любое сообщение в одном grep, установите расширенный флаг регулярного выражения -E (для «ноль или один раз» значение ? ниже) и обратное совпадение -v :

grep -Ev '^Remote:( Checking segments [[:digit:]]{1,3}\.[[:digit:]]%)?$'

, которое говорит, что строки должны (обратные) совпадать:

  • начало строки ^
  • строка Удаленный:
  • сгруппированный ( ... ) набор символов (с начальным пробелом) Проверка сегментов ... , соответствует либо ноль, либо один раз с: ?
  • в разделе [[: digit:]] указано соответствие между 1 и 3 цифрами, за которыми следует точка, за которой следует одна цифра , а затем символ %
  • , привязанный к концу строки $

После дальнейшего уточнения из OP окончательный grep выглядит так:

grep -Ev "^Remote:\s*(Checking segments.*)?$"

который удаляет любую строку соответствие (начиная с начала ^ строки), слово «Remote:», затем любое (или нет) am количество пробелов, затем либо:

  • ничего, либо

  • сама фраза «Проверка сегментов», за которой следуют любые (или нет) символы . *

... и затем конец строки $

1
28.01.2020, 02:48

Теги

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