내가 관리하는 모든 서버의 다양한 인터페이스의 네트워크 구성에 대한 특정 정보를 인쇄하고 싶습니다.
- 인터페이스 이름
- 인터페이스 IPv4 주소
- 인터페이스 하드웨어 MAC 주소
- …
불행하게도 단순 파일에서는 ip -o addr show
줄 바꿈으로 인해 출력을 쉽게 구문 분석할 수 없습니다.awk
ip addr show
에서 인쇄가 가능한가요?정확히인터페이스 당 하나의 와이어?
awk
그렇지 않으면 and/or를 사용하여 동일한 결과를 얻을 수 있습니까 sed
? 줄이 트리별로 연결되어야 하기 때문에 이것은 두 명령에 대한 내 지식을 넘어서는 것입니다.
답변1
--brief 플래그를 사용하면 됩니다.
ip --brief address show
답변2
최신 버전에서는 ip
이 옵션을 사용하여 -j
데이터를 JSON 형식으로 출력할 수 있으며, 그런 다음 다음과 같은 필터를 사용할 수 있습니다 jq
. 예를 들어 eth0
인터페이스에 IPv4 주소가 인쇄됩니다.
$ ip -j addr show dev eth0 | jq -r '.[0].addr_info | map(select(.family == "inet"))[0].local'
192.168.0.1
또는 머신의 모든 IPv4 주소 목록을 한 줄에 하나씩 가져옵니다.
ip -j addr show | jq -r 'map(.addr_info) | map(map(select(.family == "inet").local)) | flatten | .[]'
127.0.0.1
192.168.0.1
172.19.0.1
172.17.0.1
172.18.0.1
select(...)
예를 들어 IPv6 주소를 포함하려면 삭제하세요. 다른 많은 변형이 가능합니다.
답변3
예 ip -o addr show
, 하지만 더 적은 정보가 인쇄됩니다.
ip addr show
이는 각 인터페이스의 출력을 한 줄로 압축하는 방법입니다 . 첫 번째 줄을 제외하고 각 인터페이스 시작 전에 개행 문자를 인쇄한 다음 파일 끝에 개행 문자를 인쇄합니다.
ip addr show |
awk '/^[^ ]/ && NR!=1 {print ""}
{printf "%s", $0}
END {print ""}'
답변4
스크립트는 귀하가 요청한 정보를 제공하기 위해 gawk
구문 분석합니다 . ip addr show
여러 IPv4 주소는 쉼표로 연결됩니다.
ip a | awk 'function outline() {if (link>"") {printf "%s %s %s\n", iface, inets, link}} $0 ~ /^[1-9]/ {outline(); iface=substr($2, 1, index($2,":")-1); inets=""; link=""} $1 == "link/ether" {link=$2} $1 == "inet" {inet=substr($2, 1, index($2,"/")-1); if (inets>"") inets=inets ","; inets=inets inet} END {outline()}'
가독성을 높이기 위해 나누어서,
ip addr show |
awk '
# Output function to format results (if any)
function outline() {
if (link>"") {printf "%s %s %s\n", iface, inets, link}
}
# Interface section starts here
$0 ~ /^[1-9]/ {
outline(); # Output anything we previously collected
iface=substr($2, 1, index($2,":")-1); # Capture the interface name
inets=""; # Reset the list of addresses
link="" # and MAC too
}
# Capture the MAC
$1 == "link/ether" {
link=$2
}
# Capture an IPv4 address. Concatenate to previous with comma
$1 == "inet" {
inet=substr($2, 1, index($2,"/")-1); # Discard /nn subnet mask
if (inets>"") inets=inets ","; # Suffix existing list with comma
inets=inets inet # Append this IPv4
}
# Input processing has finished
END {
outline() # Output remaining collection
}
'
출력 예
eth0 10.0.2.15 08:00:27:0f:db:b3
eth1 192.168.56.101 08:00:27:33:04:26