내 카드의 지원 수준이 더 높은지 확인하기 위해 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