到目前为止,精心制作的脚本
iostat -p -x 1 2| grep $1[^[:digit:]] | awk '{print $9}'将返回两行:
0.16
0.00因为iostat正在采集两个样本。但你已经知道了。我的问题是,既然你和我都知道每次都会是两行,那么我如何准确地选择第二行呢?
发布于 2012-09-20 06:14:48
在{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“行是第三个命令的结果。
补充说明:由于awk可以匹配文本,因此不需要运行单独的grep命令。但是,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发布于 2012-09-20 06:04:01
通过管道将其发送到tail -1,这将选择最后一行。
iostat -p -x 1 2| grep $1[^[:digit:]] | awk '{print $9}' | tail -1发布于 2012-09-20 06:08:06
通过结合使用head和tail,您可以从输入中选择任意序列的行:
(cmd) | tail -n+2 | head -n 1无论命令的输出有多长,都获取输入的第二行。
https://stackoverflow.com/questions/12503555
复制相似问题