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