如何在awk中循环列?

时间:2018-05-17 14:34:19

标签: linux bash awk

当我这样做时

/usr/lib64/nagios/plugins/check_disk -w 20% -c 10% -A -I '/run/*' -I '/tmp/*' | cut -f2 -d"|" | \
awk '{
  for (i = 1; i <= NF; i++){
    print $i
  }
}'

我得到了

/dev=0MB;6356;7151;0;7946
/dev/shm=74MB;6367;7163;0;7959
/sys/fs/cgroup=0MB;6367;7163;0;7959
/=12975MB;12792;14391;0;15990
/home=139507MB;190780;214627;0;238475
/mnt/dat0=2316MB;35376;39798;0;44221

问题

如何循环遍历由$i分隔的;中的每个元素?

4 个答案:

答案 0 :(得分:1)

使用函数Application.Current.Dispatcher并将正则表达式设置为split(),将每个字段放入数组[;=]

a

请注意,/usr/lib64/nagios/plugins/check_disk -w 20% -c 10% -A -I '/run/*' -I '/tmp/*' | awk -F'|' '{ split($2, a, "[;=]"); for(i in a){ print a[i] } }' 命令可以使用第二个字段替换为cut

答案 1 :(得分:1)

#!/bin/bash

/usr/lib64/nagios/plugins/check_disk -w 20% -c 10% -A \
| cut -d'|' -f2- | xargs printf '%s\n' | sed 's/=/;/' \
| awk -F';' '{
    print "---"
    print "Path: " $1
    print "Size: " $2
    print "Warn: " $3
    print "Crit: " $4
    print "Min: " $5
    print "Max: " $6
    print "---"
}'

cut -d'|' -f2-选择效果数据。

xargs printf '%s\n'将每个条目放在一个单独的行上。

为方便起见,

sed 's/=/;/'=替换每行上的第一个;

awk -F';' …;处的每一行拆分并照常分配位置参数。

答案 2 :(得分:0)

您需要更改分隔符标志。使用awk -F ';'

答案 3 :(得分:0)

你可以尝试

EXECUTABLE=server

build: 
     docker build -t $(EXECUTABLE) - << EOF \
         FROM scratch \
         ADD bin/$(EXECUTABLE) /bin/$(EXECUTABLE) \
         CMD ["/bin/$(EXECUTABLE)"] \
     EOF
  

执行命令后... check_disk ... | cut -f2 -d“|”
  得到的行像/ dev = 0MB; 6356; 7151; 0; 7946
  awk什么都不做,因为默认的FS(字段分隔符)是空格,并且你的行中没有空格   如果你告诉awk RS =';'
  每条记录以“;”结尾   对于读取的每一行,awk找到超过1条记录   如果告诉awk ORS(输出字段分隔符)=“\ n”
  awk在新行中打印每条记录
  所以与前一行相同   awk'1'RS =';' ORS = '\ n'

你得到:

  

的/ dev = 0MB
  6356
  7151
  0
  7946

这个awk非常简单,1只告诉awk打印。