是否可以重新排列 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