次のパイプに別のものを渡しながら、1つを印刷したりコンソールに送信したりする方法はありますか?それは次のとおりです。
echo dog | printOrWhatnot "PUTTING MY THING DOWN" | sed 's/dog/cat/g' | printOrWhatnot "FLIP IT"|rev
結果は次のとおりです。
PUTTING MY THING DOWN
FLIP IT
tac
編集する:これは複数行の入力にも機能します。
printOrWhatNot() {...}
seq 10 30 |printOrWhatNot searching for 3s | grep 3
出力されます
searching for 3s
13
23
30
Larsの答えは最初の入力だけを渡すようです(ここでは10
)。
また、理想的には、処理中に出力がインライン化されます。これはGlennの答えで見たものとは異なります。だから
seq 10 30 |tee /dev/tty |printOrWhatNot searching for 3s | grep 3
次の点に役立ちます。
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
searching for 3s
13
23
30
答え1
私はこの目的のための標準コマンドを知りませんが、小さなシェルスクリプトを使って自分で書くのは簡単です。次を生成して実行可能にし、その場所をPATHに追加します。
編集する- 複数行の標準入力を処理し、入力時にスペースを処理するように更新されました。
印刷しても何でも:
#!/bin/bash
# printOrWhatnot script, to re-pipe stdin, while echoing something else via stderr
# read stdin (possibly multi-lined) into $my_array[]:
while read -t 1 piped
do
my_array=("${my_array[@]}" "$piped")
done
# echo the supplied arguments by sending them to stderr:
echo "$@" 1>&2
# now spew $my_array[], line by line, to any further processing:
arrayLen=${#my_array[@]}
for (( i=0; i<$arrayLen; i++ ));
do
echo ${my_array[$i]}
done
今提案したように動作します。
myhost> echo dog | printOrWhatnot "PUTTING MY THING DOWN" | sed 's/dog/cat/g' | printOrWhatnot "FLIP IT"|rev
PUTTING MY THING DOWN
FLIP IT
tac
答え2
stdout以外のファイル記述子にメッセージを送信し、stdinを変更せずにstdoutにダンプする必要があります。
printOrWhatnot() { echo "$@" >&2; cat -; }
(最終的に)標準出力にメッセージが表示されるようにするには、パイプを中かっこに変更またはrev
包みます。rev 2>&1
{
echo dog |
printOrWhatnot "PUTTING MY THING DOWN" |
sed 's/dog/cat/g' |
printOrWhatnot "FLIP IT" |
rev
} 2>&1