linux - 如何使用 awk 提取 "second"值?

标签 linux bash awk

迄今为止精心制作的脚本

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/

相关文章:

c - 如何在 linux 内核 3.5 编程中用 null/0s/1s 替换文件的内容

linux - 从 bash 脚本捕获所有输入和输出

bash - 按字母数字查找目录

linux - Shell 脚本无法解析主机列表和主机未知

c# - 在 C# 中以编程方式进行 Win7 屏幕截图

linux - 使用 ssh 启用无密码身份验证

linux - 如果文件 1 中的 A 列等于文件 2 中的 B 列,打印行

bash - 从模式匹配中删除直到下一个模式

unix - 比较两行,如果模式在任何顺序行的两列之间重复,则只打印一行

linux - 替换文件每一行中的每个第二个单词实例