我从收到的snmp陷阱设置了一个bashvariables中的以下输出:
echo $ var
Nov 27 16:20:34 witness logger: trap: vars: DISMAN-EVENT-MIB::sysUpTimeInstance = 0:6:10:29.06, SNMPv2-MIB::snmpTrapOID.0 = SNMPv2-SMI::enterprises.11.2.29.2.90.0.10000002, SNMPv2 SMI::enterprises.11.2.29.2.90.1 = "Finished Number", SNMPv2-SMI::enterprises.11.2.29.2.90.2 = "Filter Cirteria: [called='3333']", SNMPv2-SMI::enterprises.11.2.29.2.90.3 = "Cleared", SNMPv2 SMI::enterprises.11.2.29.2.90.4 = "major Over-Flow alert on Finished Number for ['3333']", SNMPv2 SMI::enterprises.11.2.29.2.90.5 = "The Corresponding Metric Value is: 0.5", SNMPv2- SMI::enterprises.11.2.29.2.90.6 = "Over-Flow", SNMPv2-SMI::enterprises.11.2.29.2.90.7 = "Tue Nov 27 16:20:05 CET 2012"
我试图在variables中获得以下输出:
var1 = "Tue Nov 27 16:20:05 CET 2012" var2 = "Finished Number" var3 = "The Corresponding Metric Value is: 0.5" var4 = "Cleared" var5 = "major Over-Flow alert on Finished Number for ['3333']"
我正在考虑通过awk来做这件事
基于snmp的OID:企业11.2.29.2.90.4,企业11.2.29.2.90.5,11.2.29.2.90.6等…
但似乎无法提取引用内容的内容“”
看来你想匹配所有的双引号内的字符串,这是最简单的与grep
完成:
$ echo $var | grep -o '"[^"]*"' "Finished Number" "Filter Cirteria: [called=3333]" "Cleared" "major Over-Flow alert on Finished Number for [3333]" "The Corresponding Metric Value is: 0.5" "Over-Flow" "Tue Nov 27 16:20:05 CET 2012"
说明:
-o
只打印匹配的部分。
" # Match opening double quote [^"]* # Match anything not a double quote " # Match closing double quote
希望这可以帮助你开始。
Perl解决方案:
echo "$var" | perl -nE 'say "var", ++$x, "=$1" while /(".*?")/g'
输出:
var1="Finished Number" var2="Filter Cirteria: [called='3333']" var3="Cleared" var4="major Over-Flow alert on Finished Number for ['3333']" var5="The Corresponding Metric Value is: 0.5" var6="Over-Flow" var7="Tue Nov 27 16:20:05 CET 2012"
让我们从一些简单的东西开始,以便在使用awk
时可以看到这些字段将如何分解:
echo "${var}" | awk 'BEGIN{FS="\""} {for (i=1; i<=NF; i++) {print "["i"]", $i}}'
或者,如果你的shell支持herestrings:
awk 'BEGIN{FS="\""} {for (i=1; i<=NF; i++) {print "["i"]", $i}}' <<< "${var}"
输出:
[1] Nov 27 16:20:34 witness logger: trap: vars: DISMAN-EVENT-MIB::sysUpTimeInstance = 0:6:10:29.06, SNMPv2-MIB::snmpTrapOID.0 = SNMPv2-SMI::enterprises.11.2.29.2.90.0.10000002, SNMPv2 SMI::enterprises.11.2.29.2.90.1 = [2] Finished Number [3] , SNMPv2-SMI::enterprises.11.2.29.2.90.2 = [4] Filter Cirteria: [called='3333'] [5] , SNMPv2-SMI::enterprises.11.2.29.2.90.3 = [6] Cleared [7] , SNMPv2 SMI::enterprises.11.2.29.2.90.4 = [8] major Over-Flow alert on Finished Number for ['3333'] [9] , SNMPv2 SMI::enterprises.11.2.29.2.90.5 = [10] The Corresponding Metric Value is: 0.5 [11] , SNMPv2- SMI::enterprises.11.2.29.2.90.6 = [12] Over-Flow [13] , SNMPv2-SMI::enterprises.11.2.29.2.90.7 = [14] Tue Nov 27 16:20:05 CET 2012 [15]
现在根据需要选择字段:
var1=$(awk 'BEGIN{FS="\""} {print $14}' <<< "${var}") var2=$(awk 'BEGIN{FS="\""} {print $2}' <<< "${var}") var3=$(awk 'BEGIN{FS="\""} {print $10}' <<< "${var}") var4=$(awk 'BEGIN{FS="\""} {print $6}' <<< "${var}") var5=$(awk 'BEGIN{FS="\""} {print $8}' <<< "${var}")
说明:
awk 'BEGIN{FS="\""}
:这里我们使用awk
来分隔"
{print $14}'
:打印用引号括起来的特定字段 <<< "${var}"
:如果可用,使用herestring而不是echo(见上) $var
的格式在字段排序方面保持相对一致 $ echo "$var" | awk -F\" 'BEGIN{n=split("14 2 10 6 8",v," ")} {for (i=1;i<=n;i++) printf "var%d = \"%s\"\n",i,$(v[i])}' var1 = "Tue Nov 27 16:20:05 CET 2012" var2 = "Finished Number" var3 = "The Corresponding Metric Value is: 0.5" var4 = "Cleared" var5 = "major Over-Flow alert on Finished Number for ['3333']"
另外,也许更多你想要的,这里是如何用awk执行的结果填充一个shell数组:
$ IFS=$'\n' varArr=( $(echo "$var" | awk -F\" 'BEGIN{n=split("14 2 10 6 8",v," ")} {for (i=0;i<=n;i++) printf "\"%s\"\n",$(v[i])}') ) $ echo "${varArr[1]}" "Tue Nov 27 16:20:05 CET 2012" $ echo "${varArr[2]}" "Finished Number" $ echo "${varArr[3]}" "The Corresponding Metric Value is: 0.5" $ echo "${varArr[4]}" "Cleared" $ echo "${varArr[5]}" "major Over-Flow alert on Finished Number for ['3333']"
如果你不想在你的文本中引用引号,只是不要把它们添加到awk脚本中:
IFS=$'\n' varArr=( $(echo "$var" | awk -F\" 'BEGIN{n=split("14 2 10 6 8",v," ")} {for (i=0;i<=n;i++) print $(v[i])}') )
上面的两个都会把整个输入字符串放在$ {varArr [0]}中。 这是一个微不足道的调整,如果这是不可取的。
我最终使用awk解决方案,但其他人也非常适合。 谢谢大家。
val=$(echo $val | awk '{for(i=1;i<=NF;i++)if($i~/is:/)print $(i+1)}' | cut -d\" -f 1)
有关信息,当接收到陷阱时,脚本将在snmptrapd中使用,它会将日志放入消息中,并对特定的警报执行其他操作。
主循环如下:
vars= while read oid val do if [ "$vars" = "" ] then vars="$oid = $val" else vars="$vars, $oid = $val" if [ "$oid" == "SNMPv2-SMI::enterprises.11.2.29.2.90.5" ] then val=$(echo $val | awk '{for(i=1;i<=NF;i++)if($i~/is:/)print $(i+1)}' | cut -d\" -f 1) /bin/logger "found: value 5: $val " val5=$val fi fi done