構造化テキストファイルから特定の種類の属性を持つすべてのレコードのID属性を抽出します。

構造化テキストファイルから特定の種類の属性を持つすべてのレコードのID属性を抽出します。

アップデート:まず、デバイスの完全な設定セクションを見て問題を解決しました。次に、次のコマンドを使用しますegrep -wir 'peer' test* | uniq | sort | cut -d\ -f3 ~/test.txt

  • これが私が得た結果です:
    neighbour
    00.000.0.000 (the IP address, I just put all 0s as an example)
    abc-hub
    nib
    SEC-INC-PA-int Azure_ER_key
    abc23
    ijf689
    jkl412
    kli456
    peer
    
    

出力にのみインポートするようにフィルタリングするにはどうすればよいですか? :

abc23
ijf689
jkl412
kli456

特定の場所のハブ別にグループ化された特定の顧客のすべてのルーターのリストを取得する必要があります。顧客の名前がと仮定しますtest

  • 顧客構成ファイルの例は次のとおりです。
    abc23   interface: Tunnel000
            Type:Hub
    aqw789  interface: Tunnel222
            Type:Spoke
    ert458  interface: Tunnel111
            Type:Spoke
    ijf689  interface: Tunnel333
            Type:Hub
    jkl412  interface: Tunnel000
            Type:Hub/Spoke
    kli456  interface: Tunnel111
            Type:Hub
    

このコマンドを試してみました。

egrep -wir 'hub' test* cut -d : -f1 | uniq

しかし、期待した結果は得られませんでした。

出力が次のようになります。

abc23
ijf689
jkl412
kli456

ちなみに私はGNUを使用しています。 Linuxバージョン3.2.0-6-amd64、GCCバージョン4.9.2

ご協力ありがとうございました!ありがとうございます! :)

答え1

man grep awk以下を読んで実行してください。

grep -B1 -w -i "hub" test | \
  grep -i "interface:" | \
  awk '{print $1}'

答え2

grep -B 1 "Type:Hub" test* | grep "interface:" | awk '{print $1}'

答え3

次のawkプログラムは、次のことを行う必要があります。

awk '$1~/^Type/{split($1,f,/:/);t=f[2]} $2~/^interface/{if (id && t~/Hub/) print id; id=$1; t=""} END{if (id && t~/Hub/) print id}' test.txt

:これは、余分な空白なしで(特にドアの内側とType周囲の/)フォーマットが表示されているのとまったく同じであると仮定します。

  • 「Word」で始まる最初の行から行を配列Typeに分割し、2番目の項目を変数として保存します。:ft
  • 2番目の「Word」で始まる行にinterface最初の「Word」(ルーターID)を保存します。その前に、前の履歴からルーターIDが保存されていることを確認してください。もしそうなら、古いタイプに「Hub」という単語が含まれている場合は、古いIDを印刷します。また、t解析を妨げる「残りの」情報がないことを確認するためにリセットしました。
  • ファイルの最後でも同じことを行います。

答え4

sed -e 'N; y/\n/ /' -e '/Type:Hub/!d; s/ .*//' file

これは、一対のinterface:-Type:ラインを一緒に結合し、次のラインをN; y/\n/ /含めた後sed

abc23   interface: Tunnel000         Type:Hub
aqw789  interface: Tunnel222         Type:Spoke
ert458  interface: Tunnel111         Type:Spoke
ijf689  interface: Tunnel333         Type:Hub
jkl412  interface: Tunnel000         Type:Hub/Spoke
kli456  interface: Tunnel111         Type:Hub

N次の行をバッファに追加し、行間y/\n/ /に含まれる改行を空白に置き換えます。)

コマンドの残りの部分は、sed一致しないすべての行を削除し、残りの行のType:Hub最初の空白文字内のすべての項目を削除します。/Type:Hub/!d不要な行を削除し、s/ .*//最初のスペースの行を切り捨てます。

あなたが得る最終結果は

abc23
ijf689
jkl412
kli456

関連情報