2016-03-25 12 views
0

私はSNMPWALK呼び出しの結果を解析する助けを得ることができるのだろうかと思っていました。私は、ここにほとんどこの正確な質問に関連するいくつかの質問があることを知っています。例えば、私が見て、これら二つの質問からの提案解決しようとした:ここで開始するにはBash - Parse snmpwalkの出力

  1. Parsing snmpwalk output
  2. Parse SNMP output in Bash

を私が解析しようとしていますsnmpwalkコマンドと結果である:

SNMPWALKコマンド:

snmpwalk -v1 -c public 192.168.2.51 -Ovq IF-MIB::ifDescr 

SNMPWALK結果:

Software Loopback Interface 1. 
WAN Miniport (SSTP). 
WAN Miniport (L2TP). 
WAN Miniport (PPTP). 
WAN Miniport (PPPOE). 
WAN Miniport (IPv6). 
WAN Miniport (Network Monitor). 
WAN Miniport (IP). 
RAS Async Adapter. 
Atheros AR8152 PCI-E Fast Ethernet Controller. 
Realtek RTL8191SE Wireless LAN 802.11n PCI-E NIC. 
... 

基本的に私が何をしようとしています何のための検索です。 "(?)無線LAN 802.11 PCI-Eニック。"どこ ?値a-zを表し、NICの後に余分な値を取り除く。

本質的に上記のリストから返される値はRealtek RTL8191SE Wireless LAN 802.11n PCI-E NIC.で、Realtek RTL8191SE部分が削除されています。私はまた、NIC.の後に値を持つ項目を返さないようにしたいと思います。たとえば、次のようなものを与えた場合:

Realtek RTL8191SE Wireless LAN 802.11n PCI-E NIC - Deterministic Network Enhancer Miniport-VirtualBox NDIS Light-Weight Filter-0000. 

解決策は最後に追加値に基づいて拒否する必要があります。ここで

は私のコードは、現在、次のようになります。

 #!/bin/bash 
     ... 
     IFS=$'\n' 
     var=($(snmpwalk -v1 -c public -Ovq $1 IF-MIB::ifDescr)) 
     for i in "${var[@]}"; do 
       p=$(echo "$i" | sed 's/^.*\(Wireless LAN 802.11n PCI-E NCI.*\)/\1/') 

     #  if [[ "$p" == "Wireless LAN 802.11n PCI-E NCI." ]]; then 
         echo "$p" 
     #  fi 
     done 
     ... 

私は配列にsnmpwalkコマンドの出力を設定することで遊んでから実現したことは、各項目がスペースで区切られた値として追加されるということです。そこで、まずIFSを改行文字区切り文字に設定します。それから、私は上記のことに基づいて各行をマッチさせようとしました。

+0

を[この投稿は役立つはず](http://stackoverflow.com/questions/29613304/is-it-possible-to-escape-regex-metacharacters-reliably-with-sed) – anubhava

+0

質問を編集して、その入力が与えられたときに期待される出力を表示してください。私はあなたの入力のどの部分があなたが探したい '関連するMIB 'なのか分からないためです。 –

+0

@EdMorton私はより簡潔で簡単な質問に更新しました。 – NSaid

答えて

2

を、私は質問を理解していれば、これはそれを行う必要があります。

snmpwalk -v1 -c public -Ovq $1 IF-MIB::ifDescr | \ 
sed -n 's/.*\(Wireless LAN 802.11[a-z] PCI-E NIC\)$/\1/p' 
1

ご質問のコードはそのまま動作することはできません。

  1. あなたの(コメントの)テストは入力データの説明または入力したサンプルと一致しません。
  2. 期待される出力も含まれていませんが、あなたの説明からは、それは802.11n PCI-E NICと仮定します。

まず第一に、あなたが望むすべてがのsnmpwalkからの出力であれば、以下で十分かもしれません:

snmpwalk -v1 -c public -Ovq $1 IF-MIB::ifDescr \ 
| grep -o 'Wireless LAN 802\.11. PCI-E NIC' 

これは、一致を含む行の一部だけを返すためにはgrepの-oオプションを使用しています。

それとも、その文字列の一部だけをしたい場合は、あなたが使用できます。

snmpwalk -v1 -c public -Ovq $1 IF-MIB::ifDescr \ 
| grep 'Wireless LAN 802\.11. PCI-E NIC' \ 
| grep -o '802\.11.*NIC' 

最初のgrepはのsnmpwalkの出力から「面白い」行を取り除きます。文字列NICがその行に2回現れる危険性がある場合は、この正規表現を簡単に調整できます。この解決法は、シェルにとってはほとんど不可能であることに注意してください。それはbashを必要とせず、tcshでも動作します。 SEDでこれを行うには

そしてもちろんの

は、十分にあまりにも簡単です。

#!/usr/bin/env bash 

IFS=$'\n' readarray -t snmpwalk_out < <(snmpwalk -v1 -c public -Ovq $1 IF-MIB::ifDescr) 

for line in "${snmpwalk_out[@]}"; do 
    if [[ "$line" = *"Wireless LAN 802.11"?" PCI-E NIC"* ]]; then 
    line="$(sed 's/.*\(Wireless LAN 802\.11\)/\1/;s/NIC.*/NIC/' <<<"$line")" 
    #line="Wireless LAN 802.11${line##*Wireless LAN 802.11}"; line="${line%%NIC.*}NIC" 
    fi 
done 
:あなたは本当に配列とbashでこれを実行したい場合、あなたはこのような何かを構築する可能性がある

#!/usr/bin/env bash 

sed -ne 's/.*\(Wireless LAN 802\.11. PCI-E NIC\).*/\1/p' \ 
    < <(snmpwalk -v1 -c public -Ovq $1 IF-MIB::ifDescr) 

readarrayはbashのバージョンこのスクリプト内の2本のネストされた割当線4

を要する。なお

、最初はSEDを使用して余分な文字を取り除き、そして目bashの "Parameter Expansion"ツールを使用してそれらを削除します。 (あなたは、彼らが、bashのmanページでどのように機能するかを調べることができます。)

関連する問題