我想过滤将状态信息打印到标准错误的命令的标准错误。在这种情况下,博格备份。具体来说,默认输出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:”,然后删除任何(或没有)空白,然后:
什么也没有,或者
短语“检查段”本身后跟任何(或没有)字符
.*
...然后是该行的末尾$