지원/광고 링크 모드에 대한 ethtool 출력 비교

지원/광고 링크 모드에 대한 ethtool 출력 비교

내 카드의 지원 수준이 더 높은지 확인하기 위해 ethtool의 "지원되는 링크 모드:" 및 "광고된 링크 모드:"의 출력을 캡처하려고 하는데 스위치 쪽에서는 지원되지 않습니다. 그래서 awk나 sed를 사용하여 패턴 목록의 출력을 캡처하려고 하는데 비교할 수 있도록 해당 부분을 캡처하는 방법을 찾을 수 없습니다. 어떤 아이디어가 있나요?

ethtool em1
Settings for em1:
        Supported ports: [ FIBRE ]
        Supported link modes:   1000baseKX/Full
                                10000baseKR/Full
                                25000baseCR/Full
                                25000baseKR/Full
                                25000baseSR/Full
        Supported pause frame use: Symmetric
        Supports auto-negotiation: Yes
        Supported FEC modes: None BaseR
        Advertised link modes:     1000baseKX/Full
                                10000baseKR/Full
                                25000baseCR/Full
                                25000baseKR/Full
                                25000baseSR/Full
        Advertised pause frame use: Symmetric
        Advertised auto-negotiation: Yes
        Advertised FEC modes: None
        Speed: 10000Mb/s
        Duplex: Full
        Port: FIBRE
        PHYAD: 0
        Transceiver: internal
        Auto-negotiation: on
        Supports Wake-on: g
        Wake-on: d
        Current message level: 0x00000004 (4)
                               link
        Link detected: yes

예상되는 결과는 다음과 같습니다.

Supported link modes:      1000baseKX/Full
                                10000baseKR/Full
                                25000baseCR/Full
                                25000baseKR/Full
                                25000baseSR/Full
Advertised link modes:    1000baseKX/Full
                                10000baseKR/Full
                                25000baseCR/Full
                                25000baseKR/Full
                                25000baseSR/Full

이 출력으로 할 계획은 지원되는 링크보다 광고 링크가 적은 경우 광고 링크를 지원되는 링크와 비교하는 것입니다.

이것이 제가 생각해낸 해결책입니다. 나는 이것이 개선될 수 있다고 확신합니다:

#!/bin/bash

# Get the interface name
iface=$1

# Get the supported link modes
supported=$(ethtool $iface  | awk '/Supported link modes:/{mode=$NF; getline; while(/[[:space:]]+[0-9]+/){mode=mode" "$NF;getline}} END{print mode}')

# Get the advertised link modes
advertised=$(ethtool $iface  | awk '/Advertised link modes:/{mode=$NF; getline; while(/[[:space:]]+[0-9]+/){mode=mode" "$NF;getline}} END{print mode}')

# Compare the supported and advertised link modes
if [ "$supported" == "$advertised" ]; then
  echo "The supported and advertised link modes match."
else
  echo "The supported and advertised link modes do not match."
fi

답변1

귀하의 질문에 예상되는 출력이 표시되지 않았고 두 블록 간의 차이를 출력하려는지 확실하지 않으므로 POSIX awk를 사용하도록 요청할 수 있다고 생각했습니다.

$ cat tst.awk
{
    gsub(/^[[:space:]]+|[[:space:]]+$/,"")
    if ( s = index($0,":") ) {
        tag = substr($0,1,s-1)
        val = substr($0,s+1)
        sub(/^[[:space:]]+/,"",val)
    }
    tag2val[tag] = (tag in tag2val ? tag2val[tag] ORS : "") val
}

END {
    print "Supported link modes:"
    print tag2val["Supported link modes"]

    print ""

    print "Advertised link modes:"
    print tag2val["Advertised link modes"]
}

$ awk -f tst.awk file
Supported link modes:
1000baseKX/Full
1000baseKX/Full
1000baseKX/Full
1000baseKX/Full
1000baseKX/Full
1000baseKX/Full

Advertised link modes:
1000baseKX/Full
1000baseKX/Full
1000baseKX/Full
1000baseKX/Full
1000baseKX/Full
1000baseKX/Full

관련 정보