我目前正在编写一个检查打印机状态的脚本。输出为打印机颜色,最大级别,当前级别和当前百分比。我遇到的问题是尝试从命令中过滤颜色时。当我指定/.*\.6\.1\./
或/.*\.6\.1/
或/.*\.6/
时,CL没有输出。我的代码当前仅在我指定诸如/.*\.6\.1\.1/
或/.*\.6\.1\.3/
之类的代码时才有效,然后很明显我得到第一种或x种颜色的输出,但我希望所有颜色的输出。我想知道我是不是做错了,是否有办法解决?
需要过滤:
iso.3.6.1.2.1.43.11.1.1.2.1.1 = INTEGER: 1
iso.3.6.1.2.1.43.11.1.1.2.1.2 = INTEGER: 1
iso.3.6.1.2.1.43.11.1.1.2.1.3 = INTEGER: 1
iso.3.6.1.2.1.43.11.1.1.2.1.4 = INTEGER: 1
iso.3.6.1.2.1.43.11.1.1.2.1.5 = INTEGER: 1
iso.3.6.1.2.1.43.11.1.1.2.1.6 = INTEGER: 1
iso.3.6.1.2.1.43.11.1.1.2.1.7 = INTEGER: 1
iso.3.6.1.2.1.43.11.1.1.3.1.1 = INTEGER: 1
iso.3.6.1.2.1.43.11.1.1.3.1.2 = INTEGER: 2
iso.3.6.1.2.1.43.11.1.1.3.1.3 = INTEGER: 3
iso.3.6.1.2.1.43.11.1.1.3.1.4 = INTEGER: 4
iso.3.6.1.2.1.43.11.1.1.3.1.5 = INTEGER: 5
iso.3.6.1.2.1.43.11.1.1.3.1.6 = INTEGER: 6
iso.3.6.1.2.1.43.11.1.1.3.1.7 = INTEGER: 7
iso.3.6.1.2.1.43.11.1.1.6.1.1 = STRING: "CyanInkCartridge"
iso.3.6.1.2.1.43.11.1.1.6.1.2 = STRING: "MagentaInkCartridge"
iso.3.6.1.2.1.43.11.1.1.6.1.3 = STRING: "YellowInkCartridge"
iso.3.6.1.2.1.43.11.1.1.6.1.4 = STRING: "MattBlackInkCartridge"
iso.3.6.1.2.1.43.11.1.1.6.1.5 = STRING: "MattBlackInkCartridge"
iso.3.6.1.2.1.43.11.1.1.6.1.6 = STRING: "BlackInkCartridge"
iso.3.6.1.2.1.43.11.1.1.6.1.7 = STRING: "WasteInkTank"
iso.3.6.1.2.1.43.11.1.1.7.1.1 = INTEGER: 15
iso.3.6.1.2.1.43.11.1.1.7.1.2 = INTEGER: 15
iso.3.6.1.2.1.43.11.1.1.7.1.3 = INTEGER: 15
iso.3.6.1.2.1.43.11.1.1.7.1.4 = INTEGER: 15
iso.3.6.1.2.1.43.11.1.1.7.1.5 = INTEGER: 15
iso.3.6.1.2.1.43.11.1.1.7.1.6 = INTEGER: 15
iso.3.6.1.2.1.43.11.1.1.7.1.7 = INTEGER: 15
iso.3.6.1.2.1.43.11.1.1.8.1.1 = INTEGER: 1300
iso.3.6.1.2.1.43.11.1.1.8.1.2 = INTEGER: 1300
iso.3.6.1.2.1.43.11.1.1.8.1.3 = INTEGER: 1300
iso.3.6.1.2.1.43.11.1.1.8.1.4 = INTEGER: 1300
iso.3.6.1.2.1.43.11.1.1.8.1.5 = INTEGER: 1300
iso.3.6.1.2.1.43.11.1.1.8.1.6 = INTEGER: 1300
iso.3.6.1.2.1.43.11.1.1.8.1.7 = INTEGER: 10000
iso.3.6.1.2.1.43.11.1.1.9.1.1 = INTEGER: 1300
iso.3.6.1.2.1.43.11.1.1.9.1.2 = INTEGER: 780
iso.3.6.1.2.1.43.11.1.1.9.1.3 = INTEGER: 780
iso.3.6.1.2.1.43.11.1.1.9.1.4 = INTEGER: 780
iso.3.6.1.2.1.43.11.1.1.9.1.5 = INTEGER: 780
iso.3.6.1.2.1.43.11.1.1.9.1.6 = INTEGER: 1300
iso.3.6.1.2.1.43.11.1.1.9.1.7 = INTEGER: 4000
当前代码:
#!/bin/sh
snmpwalk -v1 -c public $1 1.3.6.1.2.1.43.11.1.1 | awk '
/.*\.6\.1\.1/ {
sub(/.*\./,"");
split($0,TT,/[ "]*/);
color[TT[1]]=TT[4];
}
/.*\.8/ {
sub(/.*\./,"");
split($0,TT,/[ "]*/);
maxlevel[TT[1]]=TT[4];
}
/.*\.9/ {
sub(/.*\./,"");
split($0,TT,/[ "]*/);
if ((TT[4] / maxlevel[TT[1]] * 100) < 50){
print "\033[31m Color: " color[TT[1]] ", Current Level: " TT[4] ", Max Level: " maxlevel[TT[1]] ", Percentage: %" TT[4] / maxlevel[TT[1]] * 100 "\033[0m";
}else{
print "\033[32m Color: " color[TT[1]] ", Current Level: " TT[4] ", Max Level: " maxlevel[TT[1]] ", Percentage: %" TT[4] / maxlevel[TT[1]] * 100 "\033[0m";
}
}
'
命令:./PrintInfo 192.168.15.102
当前输出:
Color: CyanInkCartridge, Current Level: 1300, Max Level: 1300, Percentage: %100
Color: , Current Level: 780, Max Level: 1300, Percentage: %60
Color: , Current Level: 780, Max Level: 1300, Percentage: %60
Color: , Current Level: 780, Max Level: 1300, Percentage: %60
Color: , Current Level: 780, Max Level: 1300, Percentage: %60
Color: , Current Level: 1300, Max Level: 1300, Percentage: %100
Color: , Current Level: 4000, Max Level: 10000, Percentage: %40
所需的输出:
Color: CyanInkCartridge, Current Level: 1300, Max Level: 1300, Percentage: %100
Color: MagentaInkCartridge, Current Level: 780, Max Level: 1300, Percentage: %60
Color: YellowInkCartridge, Current Level: 780, Max Level: 1300, Percentage: %60
Color: MattBlackInkCartridge, Current Level: 780, Max Level: 1300, Percentage: %60
Color: MattBlackInkCartridge, Current Level: 780, Max Level: 1300, Percentage: %60
Color: BlackInkCartridge, Current Level: 1300, Max Level: 1300, Percentage: %100
Color: WasteInkTank, Current Level: 4000, Max Level: 10000, Percentage: %40
所需的输出将具有上面列出的所有颜色,而不只是一种颜色。我上面已经说过,这样做的问题是,当我尝试进行此购买时,更改了代码/.*\.6\.1\./
而不是/.*\.6\.1\.1/
,命令行根本不显示任何输出,也没有给我错误。我在做错什么可能会导致类似这样的事情?
答案 0 :(得分:2)
问题是您的行的/.*\.6\.1\./
匹配。
如果您改为将其更改为类似这样的颜色,使其仅与颜色线匹配,
/11.*\.6\.1\./ {
您得到:
$ awk -f a.awk file
Color: CyanInkCartridge, Current Level: 1300, Max Level: 1300, Percentage: %100
Color: MagentaInkCartridge, Current Level: 780, Max Level: 1300, Percentage: %60
Color: YellowInkCartridge, Current Level: 780, Max Level: 1300, Percentage: %60
Color: MattBlackInkCartridge, Current Level: 780, Max Level: 1300, Percentage: %60
Color: MattBlackInkCartridge, Current Level: 780, Max Level: 1300, Percentage: %60
Color: BlackInkCartridge, Current Level: 1300, Max Level: 1300, Percentage: %100
Color: WasteInkTank, Current Level: 4000, Max Level: 10000, Percentage: %40
答案 1 :(得分:2)
从此开始,然后进行按摩以适合自己的需求,而不是当前正在做的事情:
$ cat tst.awk
BEGIN { FS="[. ]"; OFS=", " }
{ vals[$11][$13] = $NF }
END {
for (id in vals[6]) {
sep = ""
for (attr in vals) {
printf "%s%s", sep, vals[attr][id]
sep = OFS
}
print ""
}
}
$ awk -f tst.awk file
1, 1, "CyanInkCartridge", 15, 1300, 1300
1, 2, "MagentaInkCartridge", 15, 1300, 780
1, 3, "YellowInkCartridge", 15, 1300, 780
1, 4, "MattBlackInkCartridge", 15, 1300, 780
1, 5, "MattBlackInkCartridge", 15, 1300, 780
1, 6, "BlackInkCartridge", 15, 1300, 1300
1, 7, "WasteInkTank", 15, 10000, 4000
上面的代码将GNU awk用于真正的多维数组,如有必要,可以轻松地对任何awk进行调整。