使用 awk 解析 iostat 输出

parse iostat output using awk

我正在尝试使用 awk 从 read 行过滤参数 avgserv 的输出。

我的 iostat 命令的默认输出:iostat -D hdisk0 如下:

bash-4.4$ iostat -D hdisk0

System configuration: lcpu=32 drives=9 paths=126 vdisks=0

hdisk0          xfer:  %tm_act      bps      tps      bread      bwrtn
                          0.0      3.0K     0.1       98.3        2.9K
                read:      rps  avgserv  minserv  maxserv   timeouts      fails
                          0.0      0.8      0.0      0.0           0          0
               write:      wps  avgserv  minserv  maxserv   timeouts      fails
                          0.1      2.2      0.0      0.0           0          0
               queue:  avgtime  mintime  maxtime  avgwqsz    avgsqsz     sqfull
                          0.0      0.0      0.0      0.0        0.0         0.0
--------------------------------------------------------------------------------

使用:iostat -D hdisk0 | awk '/avgserv/' 我设法打印了匹配的行:avgserv

bash-4.4$ iostat -D hdisk0 | awk '/avgserv/'
                read:      rps  avgserv  minserv  maxserv   timeouts      fails
               write:      wps  avgserv  minserv  maxserv   timeouts      fails

但是,

首先,我只是 returning Headers,没有实际值。

其次, 我需要 return avgserv 参数,仅用于 read 行。不适用于写行。

我的最终输出应该只包含 avgserv 参数的值,并且只包含 read 行:

0.8

经过一番挖掘, 我设法 return 只有 avgserv 参数使用:iostat -D hdisk0 | awk '/avgserv/ {print }'

但是, 我得到了两条线(读和写)所需的参数,但又没有实际值。

能否请您尝试以下。

your_command | 
awk '
/avgserv/ && /read/{
  found=1
  next
}
found{
  print 
  found=""
}'

一种线性形式的解:

your_command | awk '/avgserv/ && /read/{found=1;next} found{print ;found=""}'

说明:为以上代码添加说明。

your_command |              ##Sending your command output as standard input to awk command.
awk '                       ##Starting awk command from here.
/avgserv/ && /read/{        ##Checking condition if a line has string avgserv AND read then do following.
  found=1                   ##Setting variable found value to 1 here.
  next                      ##next will skip all further statements from here.
}                           ##Closing BLOCK for above condition here.
found{                      ##Checking condition if found is NOT NULL then do following.
  print                   ##Printing 2nd field here.
  found=""                  ##Nullifying variable found here.
}'                          ##Closing BLOCK for found condition here.

对面短抓:

$ iostat -D hdisk0 | awk '/write: +.*avgserv/{ print v; exit }{ v= }'
0.8