これまでに巧妙に作成されたスクリプト
iostat -p -x 1 2| grep $1[^[:digit:]] | awk '{print $9}'
次の 2 行が返されます。
0.16
0.00
iostat は 2 つのサンプルを取得しているためです。しかし、あなたはすでにそれを知っていました。私の質問は、あなたと私は毎回正確に 2 行になることを知っているので、正確に 2 番目の行をどのように選択するのでしょうか?
レコード 2 に一致するように伝えるNR==2
前に追加します。{print $9}
awk
たとえば、私のシステムでは、
$ iostat -x /dev/sda 1 2 | grep sda
$ iostat -x /dev/sda 1 2 | grep sda | awk 'NR==1 {print $9}'
$ iostat -x /dev/sda 1 2 | grep sda | awk 'NR==2 {print $9}'
生産された
sda 0.11 1.04 2.00 1.28 125.95 63.24 115.15 0.07 21.04 4.66 46.60 2.36 0.78
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.07
0.00
その「0.00」行は、3 番目のコマンドの結果です。
追記:テキストを照合できるので、別のgrep
コマンドを実行する必要はありません。awk
ただし、awk スクリプトにはインデックス変数が必要です。次の例の最初のものは、何が機能するgrep
かを示す簡単なものawk
です。次の 2 つの例はawk
、インデックスをインクリメントする一致テストと、出力する別の一致テストとインデックス テストを含む単純なコードです。最後の例は、一致式の余分な出現を取り除く方法を示しています。これらの例では、わかりやすくprint $9
するために とに置き換えたことに注意してください。以下は、 in の代わりに in でマッチングを行う例です:print
$1[^[:digit:]]
sda[^0-9]
awk
grep
$ iostat -p -x 1 2 | grep 'sda '
sda 0.11 1.04 2.00 1.28 125.70 63.16 115.09 0.07 21.04 4.66 46.57 2.36 0.78
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
$ iostat -p -x 1 2 | awk '/sda[^0-9]/ {++t} t==1 && /sda[^0-9]/ {print}'
sda 0.11 1.04 2.00 1.28 125.70 63.16 115.09 0.07 21.04 4.66 46.57 2.36 0.78
$ iostat -p -x 1 2 | awk '/sda[^0-9]/ {++t} t==2 && /sda[^0-9]/ {print}'
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
$ iostat -p -x 1 4 | awk '/sda[^0-9]/ && t++ && t==2 {print}'
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
組み合わせhead
てtail
、入力から任意の行のシーケンスを選択できます。
(cmd) | tail -n+2 | head -n 1
コマンドの出力の長さに関係なく、入力の2行目を取得します。
にパイプするとtail -1
、最後の行が選択されます。
iostat -p -x 1 2| grep $1[^[:digit:]] | awk '{print $9}' | tail -1