迄今为止精心制作的脚本
iostat -p -x 1 2| grep $1[^[:digit:]] | awk '{print $9}'
将返回两行:
0.16
0.00
因为 iostat 正在采集两个样本。但你已经知道了。我的问题是,既然你我都知道每次都是两行,我如何准确地挑选出第二行?
最佳答案
在{print $9}
之前添加NR==2
,告诉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
关于linux - 如何使用 awk 提取 "second"值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12503555/