"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

관련 정보