ステータス情報を標準エラーとして出力するコマンドの標準エラーをフィルタリングしたいと思います。この場合、ボグバックアップ。特に、デフォルト出力には次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:
これらの2つの状況を排除するために、逆方向grepをどのように修正しますか?
{ borg check faheem@ramnode:/mnt/backup-Mail 2>&1 1>&3 | tr '\r' '\n' | grep -v ":Checking segments" 1>&2; } 3>&1
最初のケースでは機能しますが、2番目のケースでは機能しませんRemote:
。 2つのgrepを使用できますが、1つの式を使用することを好みます。
ベストアンサー1
grepでメッセージをフィルタリングするには、-E
拡張正規表現フラグ(?
以下の「0または1」の意味)と-v
逆方向の一致を導入してください。
grep -Ev '^Remote:( Checking segments [[:digit:]]{1,3}\.[[:digit:]]%)?$'
これは、次の行が(逆方向に)一致する必要があることを意味します。
- 行の始まり
^
- ひも
Remote:
- 次のいずれか0または1に一致するグループ化された
(
...)
文字セット(前のスペースを含む):Checking segments ...
?
- これ
[[:digit:]]
は、1〜3桁の数字、ピリオド、数字、%
記号の順に一致することを意味します。 - すべて行末に固定
$
OPのさらなる説明によると、最終的なgrepは次のようになります。
grep -Ev "^Remote:\s*(Checking segments.*)?$"
「Remote:」という単語に一致するすべての行を削除し(^
行の先頭から始まり)、スペースを削除するか、スペースを削除してから、次の操作を行います。
何もない
「セグメントの確認」というフレーズ自体の後には、任意の文字(または文字なし)が続きます。
.*
...そして行の終わり$