"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でprintの代わりにprintfを使用してください。

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

print -> 各出力に新しい行を追加します。

printf- >新しい行を追加せずに希望の形式で印刷します。

答え2

出力の並べ替えawkコマンドから(つまり、awkコマンドを再作成せずに)出力をにパイプしますsed 'N; y/\n/ /'。その後、各行を読み、awkその間にスペースを入れて次の行を追加します。

つまり

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

関連情報