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方式取得正規表示式模式比對組的內容並取代目前行(用 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 inetand 標準工具,例如使用trand cut

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

相關內容