stdoutを2回使用する(しかし私が知っている限りティーではない)

stdoutを2回使用する(しかし私が知っている限りティーではない)

関連質問があります stdoutを2方向に分岐する方法 しかし、他の反転があります。 (Tシャツについてはすでに知っています!:)

出力をそのまま表示し(ティーからコンソールに?)、さらに改善するためにパイプに接続したいと思います。

例:私は持っています

ps -ef | grep -i something

今、両側ともこの結果を確認し、さらに改善できることを願っています。

| awk '{print "epwdx "$2}'

もちろん、2つのコマンドを順番に実行してすべての結果をキャプチャすることができますが、時にはコマンドを1つの単位で実行して、一貫した現在の真実を伝える可能性を高めたい場合があります。

おそらく他のトリック(例えば、-、2>、&2など)を使用してこれを行う方法があるかもしれませんが、まだ見たことがありません。

答え1

出力をパイプの中央から端子にプルするには(または)teeに接続します。/dev/tty/dev/stderr

これにより、出力がsomething端末に印刷され、同じ出力がsomefilter出力ファイルに渡されます。

somecmd | tee /dev/tty | somefilter > output 

ただし、後で出力を表示するには、最終出力と中間出力の両方をファイルに保存してから表示するのが簡単になります。

psただし、表示される一連のプロセスまたは印刷されるフィールドのみをフィルタリングしたい場合は、プログラムにはいくつかの組み込みオプションもあります。より手動プロセス選択、出力書式、書式指定子の場合。

答え2

使用できるpeeあなたが持っているなら:

おしっこはTシャツに似ていますが、パイプ用です。各コマンドは実行され、標準入力のコピーを提供します。すべてのコマンドの出力はstdoutに送信されます。 teeに似ていますが、入力コピーはteeのようにstdoutに送信されません。

入力をSTDOUTにコピーするコマンドを暗黙的に指定する必要があるようです。

ps -ef | pee "cat" "grep -i something"

答え3

tee次のプロセス置換を使用できます。

ps -ef | grep -i something | tee >(awk '{print "epwdx "$2}')

@roaimaが良い解決策を提供したと思いますが、awkこれはおそらく最良の方法です。

答え4

私が知っている限り、ファイル記述子だけではこれをtee >/dev/tty行うことはできません。

情報を共有するには、次のように bash 構成ファイルの関数を使用して作業を行っています。

function teee { a="$(</dev/stdin)";echo -e "pipe in\n$a\npipe out\n" >/dev/stderr; echo "$a"; }

テスト:

$ cat file11 |teee|grep -Po '[A-Za-z]+[\s|\w]+,\s[0-9]+' file11 | teee |awk '{print $2}'
pipe in
Ubuntu, 120, 143, 154
Yggdrasil, 144, 170-171
Yood, Charles, 6
We Were Young, Bob, 178-179
Zawinski, Jamie, 204
pipe out

pipe in
Ubuntu, 120
Yggdrasil, 144
Charles, 6
Bob, 178
Jamie, 204
pipe out

120
144
6
178
204

関連情報