bash - 単一の文字に分割し、見つかった項目を文字列に一致させます。

bash - 単一の文字に分割し、見つかった項目を文字列に一致させます。

簡単に言うと:

次の入力(ノードのデバイス「リスト」のようなもの)が与えられたら、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

使用grepcut:

<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

おすすめ記事