从远程 BorgBackup 存储库过滤标准错误输出

从远程 BorgBackup 存储库过滤标准错误输出

我想过滤将状态信息打印到标准错误的命令的标准错误。在这种情况下,博格备份。具体来说,默认输出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

适用于第一种情况,但不适用于第二种情况,即 just Remote:。我可以使用两个 grep,但我更喜欢使用一种表达式。

答案1

要过滤掉一个 grep 中的任一消息,请引入-E扩展正则表达式标志(对于?下面的“零或一次”含义)和-v反向匹配:

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

这表示这些行应该(反向)匹配:

  • 行首^
  • 字符串Remote:
  • 分组的(...)字符集(带有前导空格)Checking segments ...,与以下内容匹配零次或一次:?
  • [[:digit:]]部分表示要匹配 1 到 3 位数字,后跟句点,后跟一位数字,然后是%符号
  • 全部锚定到行尾$

根据 OP 的进一步说明,最终的 grep 如下所示:

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

它删除任何行匹配(从^行开头开始),单词“Remote:”,然后删除任何(或没有)空白,然后:

  • 什么也没有,或者

  • 短语“检查段”本身后跟任何(或没有)字符.*

...然后是该行的末尾$

相关内容