当我这样做时
/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
分隔的;
中的每个元素?
答案 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打印。