sed: 正規表現の一致グループを抽出して出力する

sed: 正規表現の一致グループを抽出して出力する

Linux 上のネットワーク インターフェイスの IPv4 アドレスを抽出しようとしています。有効な解決策があります:

IFACE=eth0
ip a show dev $IFACE | sed -n 's/.*inet \(.*\)\/.*/\1/p'

記録のために、ip a showコマンドのサンプル出力を次に示します。

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:51:51:b4:a9:08 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.20/24 brd 10.0.2.255 scope global ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::251:56ff:fec1:4915/64 scope link 
       valid_lft forever preferred_lft forever

私の解決策はうまくいきましたが、セドウェイ正規表現パターンマッチグループの内容を取得し、現在の行を置き換えます(sedの用語では、パターンスペースs///p) を使用するか、何らかの方法で印刷しますか?パターンを行全体 (.*先頭と末尾に を含む)に使用して拡張する必要があるのは、不便だと思います。

答え1

人間向けの出力を解析するのはip面倒です。JSON 出力を使用してください。

ip -4 -json a show dev $IFACE scope global | jq -r ".[].addr_info[].local"

答え2

不要なものはすべて削除できます。例: sed -n 's:.*inet ::; T; s:/.*::p'

ただし、別の方法として、 および 標準ツールを使用する方法があります。ip -o -f inetたとえば、trおよび を使用します。cut

ip -o -f inet addr show dev eth0 | tr -s ' ' '/' | cut -d/ -f4

関連情報