stdoutにデータを出力するコマンドがあります(command1 -p=aaa -v=bbb -i=4
)。
出力行には、次の値を指定できます。
rate (10%) - name: value - 10Kbps
その「レート」を格納するために、その出力をgrepしたいと思います(ここではパイプが役立つと思います)。
最後に、そのレートを2番目のコマンドのパラメーターの値にします(たとえば、 command2 -t=${rate}
)
私の側ではトリッキーに見えます。パイプ、grep、sedなどの使い方をもっと知りたいです。
そのような組み合わせをたくさん試しましたが、混乱しています:
$ command1 -p=aaa -v=bbb -i=4 | grep "rate" 2>&1 command2 -t="rate was "${rate}
承認された回答:
2つの非常に異なるタイプの入力を混同しています。
- 標準入力(
stdin
) - コマンドライン引数
これらは異なり、さまざまな目的に役立ちます。一部のコマンドは両方の方法で入力を受け取ることができますが、通常はそれらの使用方法が異なります。たとえば、wc
コマンド:
-
stdin
による入力の受け渡し :ls | wc -l
これにより、
ls
の出力の行がカウントされます -
コマンドライン引数による入力の受け渡し:
wc -l $(ls)
これにより、ファイルリストの行がカウントされます
ls
によって印刷されます
まったく違うもの。
質問に答えるには、最初のコマンドの出力からレートを取得し、そのレートを2番目のコマンドのコマンドライン引数として使用する必要があるようです。そのための1つの方法は次のとおりです。
rate=$(command1 | sed -ne 's/^rate..([0-9]*)%.*/1/p')
command2 -t "rate was $rate"
sed
の説明 :
-
s/pattern/replacement/
コマンドはいくつかのパターンを置き換えることです - パターンの意味:行は「rate」(
^rate
で始まる必要があります )の後に任意の2文字(..
)、0桁以上、%
が続きます 、その後に残りのテキスト(.*
) -
1
置換とは、(...)
内でキャプチャされた最初の式のコンテンツを意味します 、したがって、この場合、%
の前の数字 サイン -
-n
sed
のフラグ commandは、デフォルトで行を印刷しないことを意味します。p
s///
の最後に コマンドは、置換があった場合にその行を印刷することを意味します。つまり、コマンドは一致した場合にのみ何かを出力します。