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