如何使用awk挑选出“第二”值?

时间:2012-09-19 22:02:59

标签: linux bash awk

迄今为止专业制作的剧本

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

将返回两行:

0.16
0.00

因为iostat正在拍摄两个样本。但你已经知道了。我的问题是因为你和我都知道每次都会有两行,我怎么选出第二行?

3 个答案:

答案 0 :(得分: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替换为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

答案 1 :(得分:2)

将其传送到tail -1,这将选择最后一行。

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

答案 2 :(得分:2)

结合headtail,您可以从输入中选择任何行序列:

(cmd) | tail -n+2 | head -n 1
无论命令的输出有多长,

都会获得第二行输入。