stdoutの代わりに大文字のstderr出力に変換する方法は?

stdoutの代わりに大文字のstderr出力に変換する方法は?

いくつかのファイルをバックアップするためにrsyncを使用しています。

rsync -PaSh --stats --delete -e "-i key -p XXXX" "/source/" [email protected]:/destination/ 2> output.txt | grep -e 'bytes  received' -e 'total bytes' -e files -e 'total file size:' >> output.txt

何千ものファイルがあるので、最後にエラーと要約だけを見たいです。

上記のコマンドの出力は次のようになります。

rsync: delete_file: unlink(test/test.txt) failed: Permission denied (13)
Number of files: 12 (reg: 10, dir: 2)
Number of created files: 0
Number of regular files transferred: 0
sent 382 bytes  received 137 bytes  41.52 bytes/sec

私はエラーを大文字に変換し(注意を引くために)、要約をそのまま維持したいと思います。

したがって、次のようになります。

RSYNC: DELETE_FILE: UNLINK(TEST/TEST.TXT) FAILED: PERMISSION DENIED (13)
Number of files: 12 (reg: 10, dir: 2)
Number of created files: 0
Number of regular files transferred: 0
sent 382 bytes  received 137 bytes  41.52 bytes/sec

この目標をどのように達成できますか?

ありがとう

ベストアンサー1

効果的に交換できます。標準入力そして標準出力一時ファイル記述子の助けを借りて(ここではfd 3):

cmd 3>&2 2>&1 1>&3- | tr '[:lower:]' '[:upper]'

つまり、「新しい fd をその場所として指定します。標準エラーポイント、ポイント標準エラーどこ標準出力ポイント、ポイント標準出力どこへ行く標準エラーもともとは「…簡単でしょ? :)

または言い換えれば:今標準エラーfrom はcmdこうしてパイプを通過します標準出力そしてオリジナル標準出力次にリダイレクトされました。標準エラー。このtrコマンドは大文字変換を実行します。

修正する:上記の回答を受け入れましたが、ウィッシュリストには操作機能が含まれています。標準出力そして標準エラー同時に。それでは、これを理解しようとしましょう...私が頻繁にやらないことに直面することに注意してください!

簡単な交換標準出力/標準エラー役に立つことはありません。スワップの有無にかかわらず、単一のパイプを介して2つの異なるストリームを使用することはできません。代わりに、私の最初の考えはFIFO(名前付きパイプ)を使用することでした。

mkfifo /tmp/fifo1 /tmp/fifo2

# run the key command in the background, in a subshell to suppress
# job control messages (e.g. "[1] 12345" and "[1]+ Exit ...")
( cmd > /tmp/fifo1 2> /tmp/fifo2 & )

# concatenate tr/stderr and grep/stdout using process substitution
# (I'm assuming the summary information occurs at the end of rsync output)
cat <(cat /tmp/fifo2 | tr '[:lower:]' '[:upper:]') <(grep ... /tmp/fifo1) 

rm -f /tmp/fifo1 /tmp/fifo2

必要に応じて、実際にこれらすべてを1行にまとめることができます!

mkfifo /tmp/fifo1 /tmp/fifo2; (cmd > /tmp/fifo1 2> /tmp/fifo2 &); cat <(cat /tmp/fifo2 | tr '[:lower:]' '[:upper:]') <(grep ... /tmp/fifo1); rm -f /tmp/fifo1 /tmp/fifo2

私の精神状態検査はうまくいくので、試してみてください。

おすすめ記事