Я хочу отфильтровать стандартную ошибку для команды, которая выводит информацию о состоянии в стандартную ошибку. В данном случае 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, но я бы предпочел одно выражение.
Чтобы отфильтровать любое сообщение в одном 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 количество пробелов, затем либо:
ничего, либо
сама фраза «Проверка сегментов», за которой следуют любые (или нет) символы . *
... и затем конец строки $