Linux Bash正则表达式,从SNMPGet输出中检索数据

3

我一直在家里尝试运行一些简单的监控工具,决定获取打印机数据以及其他所有内容,但是现在我已经成功地使用SNMP部分,但我似乎无法在Linux中正确解析我的SNMPGET命令检索的数据。我目前使用的脚本如下:

#!/usr/bin/env bash

# RegEx for Strings:    "(.+?)"| -?\d+ 
RegExStr='"(.+?)"| -?\d+'

# ***
# Brother HL-2150N Printer
# ***
# Order Data: Toner Naame, Toner Level, Drum Name, Drum Status, Total Pages Printer,  Display Status
Input=$(snmpget -v 1 -c public 192.168.16.112 SNMPv2-SMI::mib-2.43.11.1.1.6.1.1 SNMPv2-SMI::mib-2.43.11.1.1.8.1.1 SNMPv2-SMI::mib-2.43.11.1.1.6.1.2 SNMPv2-SMI::mib- 2.43.11.1.1.9.1.1 SNMPv2-SMI::mib-2.43.10.2.1.4.1.1 SNMPv2-SMI::mib-2.43.16.5.1.2.1.1 -m BROTHER-MIB)

Output1=( $(echo $Input | egrep -o $RegExStr) )

# Output
echo $Input
echo ${Output1[@]}

有趣的是,这并不起作用。我相当确定我的正则表达式("(.+?)")是正确的,因为我已经在各种不同的语法检查器和测试器中多次进行了测试。它应该选择所有位于引号("")之间的数据。

无论如何,SNMPGET返回的结果是:

SNMPv2-SMI::mib-2.43.11.1.1.6.1.1 = STRING: "Black Toner Cartridge" SNMPv2-SMI::mib-2.43.11.1.1.8.1.1 = INTEGER: -2 SNMPv2-SMI::mib-2.43.11.1.1.6.1.2 = STRING: "Drum Unit" SNMPv2-SMI::mib-2.43.11.1.1.9.1.1 = INTEGER: -3 SNMPv2-SMI::mib-2.43.10.2.1.4.1.1 = Counter32: 13630 SNMPv2-SMI::mib-2.43.16.5.1.2.1.1 = STRING: "SLAAP "

我已经尝试了各种方法,使用grep返回一个空字符串。据我所知,grep本身并不支持每个正则表达式命令,所以我开始使用egrep,虽然它返回了一些内容,但它是原始字符串内所有由空格分开的内容,从第一个引号开始。
我错过了什么吗?我已经看过周围,并调整了我的方法几次,但似乎从未得到可用的数组返回。
总之,我很感激你能给我任何帮助/指针。即使只是为了好玩和良好的学习体验,我也希望能让这个运行起来。无论如何,在此提前感谢您!我会继续摆弄它,但偶尔会在这里检查情况。

从SNMPGET字符串中,您想要获取什么? - Jotne
@Jotne,最后,我试图检索括号内的所有数据以及在INTEGER:和COUNTER32:之后返回的数字值。如果上面没有表述清楚,我很抱歉。 - Silvester van Harberden
@anubhava,啊!抱歉,在我进行多次编辑时出现了一个打字错误,我已经在我的主脚本中进行了更正,但它仍然没有任何作用。 - Silvester van Harberden
真的吗?那会有点麻烦。这是我在尝试选择引号之间的所有内容(包括空格)时想到的唯一方法。是否有替代这组字符的方法,或者我应该采取完全不同的方法? - Silvester van Harberden
如果非贪婪模式不起作用,你可以使用"([^"]+)吗? - JonM
显示剩余7条评论
2个回答

1
从您的输出中:
要获取所有字符串:
grep -oP 'STRING: *"\K[^"]*'
Black Toner Cartridge
Drum Unit
SLAAP 

获取所有整数:

grep -oP '(INTEGER|Counter32): *\K[^ ]*'
-2
-3
13630

我已将两行代码(以及我的原始脚本)合并为: Output1 =($(echo $Input | grep -oP' STRING:“\ K [^”] * |(INTEGER | Counter32):\ K [^] *'))这似乎非常有效!它仍然将每个空格后面的所有内容作为新的数组片段返回,但我相信这是Bash特有的。感谢您的帮助!我很感激。 - Silvester van Harberden

0

使用 awk 可以做到这一点:

awk 'NR%2==0' RS=\" <<< $Input
Black Toner Cartridge
Drum Unit
SLAAP

或者存入一个变量中

Output1=$(awk 'NR%2==0' RS=\" <<< $Input)

这似乎可以工作,尽管它将所有内容返回到单个条目Input1(0)中。当然不是什么大问题。但我想让你知道!非常感谢提供的替代方法,因为我仍在努力学习如何使用Bash命令。 :) - Silvester van Harberden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接