重新排列“ip addr show”的输出 - 可能使用 awk

重新排列“ip addr show”的输出 - 可能使用 awk

是否可以重新排列 awk 的输出?

如果是,正确的做法是什么?

wolf@Linux:~$ ip a s | awk '/^[0-9]/ {print $2} /inet / {print $2}'
lo:
127.0.0.1/8
enp0s3:
10.1.1.1/24
enp0s8:
172.16.1.1/24
enp0s9:o
192.168. it2?1.1/24
wolf@Linux:~$ 

所需输出

wolf@Linux:~$ ip a s | <awk syntax here>
lo: 127.0.0.1/8
enp0s3: 10.1.1.1/24
enp0s8: 172.16.1.1/24
enp0s9: 192.168.1.1/24
wolf@Linux:~$ 

答案1

只需在 awk 中使用 printf 而不是 print :

$ ip a s | awk '/^[0-9]/ {printf "%s ", $2 } /inet / {print $2}'

print -> 将在每个输出中添加新行

printf-> 将以您想要的格式打印并且不添加新行。

答案2

重新排列输出awk命令(即不重写awk命令),将输出传递给sed 'N; y/\n/ /'.这将从 读取每一行awk,然后将下一行附加到该行,中间有一个空格。

IE

ip a s | awk ... | sed 'N; y/\n/ /'

但重写awk命令是正确的方法(但我没有 Linux 系统来测试它,也不知道ip a s你的系统会产生什么结果)。

答案3

您似乎需要接口名称及其附加子网。该ip route命令几乎可以为您完成此操作,但环回接口除外

ip route | awk '$2=="dev"'

10.1.1.0/24 dev enp0s3 proto dhcp scope link src 10.1.1.1
172.16.1.0/24 dev enp0s8 proto dhcp scope link src 172.16.1.1
192.168.1.0/24 dev enp0s9 proto dhcp scope link src 192.168.1.1 metric 202

再挑剔一点awk,你就可以得到

ip route | awk -F '[ /]' '$3=="dev" { printf "%s: %s/%s\n", $4, $10, $2 }'

enp0s3: 10.1.1.1/24
enp0s8: 172.16.1.1/24
enp0s9: 192.168.1.1/24

要使用这种方法包含环回,您必须综合它,这并不理想

ip route | awk -F '[ /]' 'BEGIN { print "lo: 127.0.0.1/8" }; $3=="dev" { printf "%s: %s/%s\n", $4, $10, $2 }'

lo: 127.0.0.1/8
enp0s3: 10.1.1.1/24
enp0s8: 172.16.1.1/24
enp0s9: 192.168.1.1/24

相关内容