0

我正在尝试使用 awk从读取行过滤参数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

但,

首先,我只返回标题,没有实际值。

其次,我需要返回avgserv参数,仅用于读取行。不是为了写线。

我的结局输出应仅包含avgserv参数的值,并且仅用于读取行:

0.8

经过一番挖掘,我设法使用以下方法仅返回avgserv参数:iostat -D hdisk0 | awk '/avgserv/ {print $3}'

但是,我仍然获得了两条线(读取和写入)所需的参数,并且再次没有实际值。

4

2 回答 2

0

从对面短截取:

$ iostat -D hdisk0 | awk '/write: +.*avgserv/{ print v; exit }{ v=$2 }'
0.8
于 2019-11-19T15:08:12.687 回答
0

请您尝试以下操作。

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

一种内衬形式的解决方案:

your_command | awk '/avgserv/ && /read/{found=1;next} found{print $2;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 $2                  ##Printing 2nd field here.
  found=""                  ##Nullifying variable found here.
}'                          ##Closing BLOCK for found condition here.
于 2019-11-19T14:50:55.163 回答