2012-11-27 63 views
4

我在從收到的SNMP陷阱設置一個bash變量以下的輸出:AWK在bash腳本引號和空間

回聲是$ 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" 

我試圖得到以下變量輸出:

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']" 

我想通過一個基於SNMP的OID AWK

這樣做的:進入prises.11.2.29.2.90.4,enterprises.11.2.29.2.90.5,11.2.29.2.90.6等等

,但似乎無法提取引用內容「」

回答

3

看來你想匹配雙引號中的所有字符串,這是最容易做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 

希望這可以幫助您開始。

+1

+1用於解釋正則表達式;學到了新的東西=) –

3

的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" 
+1

我想大家都應該花點時間來感謝的perl被如此真棒。 – lynks

+1

然後再花點時間將腳本輸出與期望的輸出進行比較:-)。 –

+0

@EdMorton:我只是想幫忙。添加'var2 = $ var1; VAR1 = $ var7; var6 = $ VAR5; VAR5 = $ VAR4; VAR4 = $ VAR3; var3 = $ var6'留給讀者。 – choroba

2

讓我們先從簡單的東西,所以你可以看到,當您使用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而不是回聲(如果可用)(見上文)
  • 這是假設您的$var的格式在現場訂購方面保持相對一致
1
$ 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的執行結果:

$ 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]}。這是一個微不足道的調整,如果這是不可取的。

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