인터페이스당 한 줄에 "ip addr" 표시

인터페이스당 한 줄에 "ip addr" 표시

내가 관리하는 모든 서버의 다양한 인터페이스의 네트워크 구성에 대한 특정 정보를 인쇄하고 싶습니다.

  • 인터페이스 이름
  • 인터페이스 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

관련 정보