迄今为止专业制作的剧本
iostat -p -x 1 2| grep $1[^[:digit:]] | awk '{print $9}'
将返回两行:
0.16
0.00
因为iostat正在拍摄两个样本。但你已经知道了。我的问题是因为你和我都知道每次都会有两行,我怎么选出第二行?
答案 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)
结合head
和tail
,您可以从输入中选择任何行序列:
(cmd) | tail -n+2 | head -n 1
无论命令的输出有多长,都会获得第二行输入。