複数行の文字列から正規表現グループのIPアドレスを選択してください。

複数行の文字列から正規表現グループのIPアドレスを選択してください。

ルーティングテーブルからIPアドレスを選択しようとしていますが、sedまたはgrep式を作成できません。

正規表現テスターが期待どおりにグループ1を選択して動作する次の正規表現があります。

.*0\.0\.0\.0\/0.*(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b).*eth0.*

awkを使って目的の出力を簡単に取得できましたが、私の環境でスクリプトを実行すると、bash変数は空です。 sedとawkでさまざまな表現を試しましたが、おなじみのものよりも多くのセレクタが必要なようです。

/usr/bin/vtysh -c 'show ip route' |
sed -n 's/.*\(\b\d\{1,3\}\.\d\{1,3\}\.\d\{1,3\}\.\d{1,3}\b\).*eth0.*/\1/p'

次のように入力してください

Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued route, r - rejected route

S>* 0.0.0.0/0 [210/0] via 9.16.24.1, eth0, 1d06h57m
S>  0.0.0.0/0 [300/0] via 9.16.26.1, eth1, 1d06h57m
O>* 10.0.0.0/19 [110/42] via 10.255.255.21, eth1, 1d06h56m
  *                      via 10.255.255.22, eth1, 1d06h56m

予想出力:

9.16.24.1

答え1

grepawk私はこれが(GNU)または次のための仕事だと思いますsed

grep -Po "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}(?=, eth0)" file

出力:

9.16.24.1

関連情報