首页 > 解决方案 > 使用 AWK 时无输出

问题描述

我目前正在制作一个检查打印机状态的脚本。输出为打印机颜色、最大级别、当前级别和当前百分比。我遇到的问题是尝试从命令中过滤颜色时。当我指定/.*\.6\.1\./or/.*\.6\.1//.*\.6/我没有从 CL 得到输出时。我的代码目前仅在我指定类似/.*\.6\.1\.1/or时才有效/.*\.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/命令行根本不会显示任何输出,也不会给我一个错误。我做错了什么可能导致这样的事情?

标签: awk

解决方案


问题是所有行的第一部分都匹配/.*\.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

推荐阅读