我想打印有关我管理的所有服务器上不同接口的网络配置的特定信息:
- 接口名称
- 接口 ipv4 地址
- 接口硬件mac地址
- ……
不幸的是,由于换行符,简单的文件ip -o addr show
不允许轻松解析其输出。awk
是否可以ip addr show
打印在确切地每个接口一根线?
否则,是否可以使用awk
and/or获得相同的结果sed
?这超出了我对这两个命令的了解,因为这些行必须一树一树地连接起来......
答案1
只需使用 --brief 标志即可。
ip --brief address show
答案2
较新版本ip
能够使用该-j
选项输出 JSON 格式的数据,然后您可以使用过滤器(例如jq
.例如,这将打印eth0
接口上的 IPv4 地址:
$ ip -j addr show dev eth0 | jq -r '.[0].addr_info | map(select(.family == "inet"))[0].local'
192.168.0.1
或者获取机器上所有 IPv4 地址的列表,每行一个:
ip -j addr show | jq -r 'map(.addr_info) | map(map(select(.family == "inet").local)) | flatten | .[]'
127.0.0.1
192.168.0.1
172.19.0.1
172.17.0.1
172.18.0.1
select(...)
例如,删除以包含 IPv6 地址。许多其他变化是可能的。
答案3
有ip -o addr show
,但打印的信息较少。
这是一种将每个接口的输出压缩ip addr show
为一行的方法。在每个界面开始之前打印换行符,第一行除外;然后打印该行内容;在文件末尾打印换行符。
ip addr show |
awk '/^[^ ]/ && NR!=1 {print ""}
{printf "%s", $0}
END {print ""}'
答案4
该gawk
脚本将进行解析ip addr show
以提供您所请求的信息。多个 IPv4 地址用逗号连接
ip a | awk 'function outline() {if (link>"") {printf "%s %s %s\n", iface, inets, link}} $0 ~ /^[1-9]/ {outline(); iface=substr($2, 1, index($2,":")-1); inets=""; link=""} $1 == "link/ether" {link=$2} $1 == "inet" {inet=substr($2, 1, index($2,"/")-1); if (inets>"") inets=inets ","; inets=inets inet} END {outline()}'
将其拆分出来,使其更具可读性,
ip addr show |
awk '
# Output function to format results (if any)
function outline() {
if (link>"") {printf "%s %s %s\n", iface, inets, link}
}
# Interface section starts here
$0 ~ /^[1-9]/ {
outline(); # Output anything we previously collected
iface=substr($2, 1, index($2,":")-1); # Capture the interface name
inets=""; # Reset the list of addresses
link="" # and MAC too
}
# Capture the MAC
$1 == "link/ether" {
link=$2
}
# Capture an IPv4 address. Concatenate to previous with comma
$1 == "inet" {
inet=substr($2, 1, index($2,"/")-1); # Discard /nn subnet mask
if (inets>"") inets=inets ","; # Suffix existing list with comma
inets=inets inet # Append this IPv4
}
# Input processing has finished
END {
outline() # Output remaining collection
}
'
输出示例
eth0 10.0.2.15 08:00:27:0f:db:b3
eth1 192.168.56.101 08:00:27:33:04:26