簡単に言うと:
次の入力(ノードのデバイス「リスト」のようなもの)が与えられたら、IPアドレスを取得したいのですが、「ルータ」というデバイスからのみ取得できます。 (router1.、gw。またはその他ではありません):
gw.bec2,10.41.113.216,HNA: router.bec2,4|router.bec2,192.168.156.131,online,0
gw1.ros78,192.168.159.114,HNA: router.ros78,4|gw1test.ros78,10.41.112.118,HNA: router.ros78,8|gw34.ros78,192.168.159.13,HNA: router.ros78,4|router.ros78,192.168.159.125,online,0
router.jed99,10.41.118.189,online,0|router1.jed99,10.41.118.190,online,0|router2.jed99,10.41.118.191,erstellt: 09.10.14,9
最良の方法は、例から次の値のみを抽出することです。
192.168.156.131
192.168.159.125
10.41.118.189
非常に長い話:
ノード名とノードIDを取得するためにXMLファイルを解析しています。これで、「ルータ」と呼ばれるデバイスのIPも必要です。 XMLファイルは、各ノードのデバイスのリストである「devices」属性を提供します。上記では、3つのノードの例を見ることができます。この「リスト」は「|」パイプで区切られ、デバイスとその属性はカンマ "," で表されます。
これまではノード名とノードIDを取得できましたが、今ではIPを取得するのは難しいです。
xpath -q -e 'concat(/nodes/node[@name="bec2"]/@name,"-",/nodes/node[@name="bec2"]/@nodeid,"-",/nodes/node[@name="bec2"]/@devices)' map.xml
# output:
# bec2-169-gw.bec2,10.41.113.216,HNA: router.bec2,4|router.bec2,192.168.156.131,online,0
# but needed output would be something like:
# bec2-169-192.168.156.131
同様のことを試しましたが、デバイスの順序がノードによって異なるため、数値でフィールドを選択するのは適切ではないようです。
xpath -q -e 'concat(/nodes/node[@name="bec2"]/@name,"|",/nodes/node[@name="bec2"]/@nodeid,"|",/nodes/node[@name="bec2"]/@devices)' map.xml | cut -d"|" -f 1,2,4
xpath -q -e 'concat(/nodes/node[@name="ros78"]/@name,"|",/nodes/node[@name="ros78"]/@nodeid,"|",/nodes/node[@name="ros78"]/@devices)' map.xml | cut -d"|" -f 1,2,4
# output:
# bec2|169|router.bec2,192.168.156.131,online,0
# ros78|1054|gw1test.ros78,10.41.112.118,HNA: router.ros78,8
私の考えは、パイプに分割し、各デバイスをインポートしてから「router」という文字列を検索し、見つかったデバイスをインポートしてコンマに分割して2番目の属性を取得することです。
ところで、文字に分割し、数値で結果を選択せずに検索文字列で結果を選択することが可能かどうか、どうすればよいのでしょうか。
ありがとうございます。
(300レピュテーションが必要なため、xpathタグを追加できません)
答え1
使用grep
とcut
:
<file grep -Eo 'router\.[^,]*,[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | cut -d, -f2
grep
部分の後にはrouter\.
カンマ以外の文字が複数あり、[^,]*
その後にコンマ,
とIPアドレスが続きます。cut
次に、区切り文字を使用して最初の部分を削除し、-d,
2番目のフィールドはそのままにします。-f2
答え2
|
データ区切り記号を想定します。
grep -Po '\brouter\.[^|]+?(\d{1,3}\.){3}\d{1,3}' data | grep -Po '(?<=,).*'
- 最初のgrepの結果:
router.bec2,192.168.156.131
router.ros78,192.168.159.125
router.jed99,10.41.118.189
- 2番目のgrep結果:
192.168.156.131
192.168.159.125
10.41.118.189