1

迄今为止精心制作的脚本

iostat -p -x 1 2| grep $1[^[:digit:]] | awk '{print $9}'

将返回两行:

0.16
0.00

因为 iostat 正在采集两个样本。但你已经知道了。我的问题是,既然你和我都知道每次都会恰好是两行,我如何准确地挑选出第二行?

4

3 回答 3

6

添加NR==2之前{print $9}告诉awk匹配记录 2。

例如,在我的系统上,

$ 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”行是第三个命令的结果。

附加说明:不必像匹配文本那样运行单独的grep命令。awk然而,awk 脚本需要一个索引变量。以下示例中的第一个是一个简单的示例,grep以显示其awk工作原理。接下来的两个示例是简单的awk代码,其中有一个匹配测试来增加索引,另一个匹配测试加上索引测试要打印。最后一个例子展示了如何去掉匹配表达式的额外出现。请注意,在这些示例中,为了清楚起见,我将print $9其替换为. 以下是匹配 in而不是 in的示例:print$1[^[:digit:]]sda[^0-9]awkgrep

$ 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
于 2012-09-19T22:14:47.737 回答
2

通过管道将其传输到tail -1,这将选择最后一行。

iostat -p -x 1 2| grep $1[^[:digit:]] | awk '{print $9}' | tail -1
于 2012-09-19T22:04:00.773 回答
2

组合headtail允许您从输入中选择任何行序列:

(cmd) | tail -n+2 | head -n 1

无论命令的输出有多长,都会获取第二行输入。

于 2012-09-19T22:08:06.180 回答