我知道这是其他帖子中的类似问题。但是我想解析iw wlan station dump 并将最强站信号的Mac地址保存到文本文件,或者在python中将其作为变量。
比较多个具有不同信号的电台(数字越小表示强度越强)。我需要比较这多个电台的信号并选择最强信号的mac地址(例如-55与-60)
# awk '/Station/{val=$2;next} /signal/{sub(/^ +/,"");print "MAC Address: "val ORS $0;val=""}'
MAC Address: a8:83:02:cf:3d:e2
signal: -60 [-60] dBm
MAC Address: f4:60:e2:e2:2f:2e
signal: -55 [-55] dBm
我想从中得到最低的数字(最高)。只需要打印1个站(mac地址) example image
-
最新代码结果(所选信号与mac地址不匹配)
# iw dev wlan0 station dump | grep -E 'Station|signal' //Reference
Station a8:8e:08:cf:1d:e9 (on wlan0) <-------
signal: -28 [-28] dBm
Station f4:20:e2:a8:3f:3e (on wlan0)
signal: -55 [-55] dBm
# sudo iw dev wlan0 station dump | awk //Command
MAC Address: f4:20:e2:a8:3f:3e <-------
signal: -27 [-28] dBm
答案 0 :(得分:1)
EDIT5: :由于您尚未告知可以在字符串station
或字符串MAC Address
之后找到mac地址,因此我以前的代码现在只查找station
字符串,我添加了逻辑来检查这两个字符串。还应考虑<-------
仅出于理解目的,而不存在于Input_file中。
awk '
/Station/{
if(value){
b[count]=value
}
a[++count]=$2
value=""
next
}
/MAC Address/{
if(value){
b[count]=value
}
a[++count]=$NF
value=""
next
}
/signal/{
sub(/^ +/,"")
value=sig_value<$2?$0:prev?prev:$0
sig_value=$2
prev=$0
}
END{
if(value){
b[count]=value
}
for(i=1;i<=count;i++){
split(b[i],array,"[[:space:]]+")
max=max==""?array[2]:max
ip_max=max>array[2]?ip_max:a[i]
max=max>=array[2]?max:array[2]
va[max]=max>=array[2]?va[max]?va[max]:b[i]:b[i]
}
print "MAC Address: "ip_max ORS va[max]
}' Input_file
EDIT4: 根据OP以获得最低信号值,可以尝试以下操作。
awk '
/Station/{
if(value){
b[count]=value
}
a[++count]=$2
value=""
next
}
/signal/{
sub(/^ +/,"")
value=sig_value<$2?$0:prev?prev:$0
sig_value=$2
prev=$0
}
END{
if(value){
b[count]=value
}
for(i=1;i<=count;i++){
split(b[i],array,"[[:space:]]+")
max=max==""?array[2]:max
ip_max=max>array[2]?ip_max:a[i]
max=max>=array[2]?max:array[2]
va[max]=max>=array[2]?va[max]?va[max]:b[i]:b[i]
}
print "MAC Address: "ip_max ORS va[max]
}' Input_file
EDIT3: (此解决方案是获得最高信号值),因为OP再次更改了要求并告知所有站点最佳信号值,所以现在添加第4个答案尝试跟随。
awk '
/Station/{
if(value){
b[count]=value
}
a[++count]=$2
value=""
next
}
/signal/{
sub(/^ +/,"")
value=sig_value>$2?$0:prev?prev:$0
sig_value=$2
prev=$0
}
END{
if(value){
b[count]=value
}
for(i=1;i<=count;i++){
split(b[i],array,"[[:space:]]+")
ip_max=max<array[2]?ip_max:a[i]
max=max<array[2]?max?max:array[2]:array[2]
va[max]=b[i]
}
print "MAC Address: "ip_max ORS va[max]
}' Input_file
EDIT2: OP表示Input_file中可能有多个signal
字符串,然后以下内容可能会帮助您。
awk '
/Station/{
if(val && value){
print "MAC Address: "val ORS value
val=value=""
}
val=$2
next
}
/signal/{
sub(/^ +/,"")
value=sig_value>$2?$0:prev?prev:$0
sig_value=$2
prev=$0
}
END{
print "MAC Address: "val ORS value
}' Input_file
编辑: :由于OP更改了要求并要求获得最强信号的值,因此以下方法可能会有所帮助。(此处考虑到mac address
的值只会是1时间,但信号的值将是多个,我们需要从中选择最好的一个。)
awk '
/Station/{
val=$2
next
}
/signal/{
sub(/^ +/,"")
value=sig_value>$2?$0:prev?prev:$0
sig_value=$2
prev=$0
}
END{
print "MAC Address: "val ORS value
}' Input_file
请您尝试一次。
awk '/Station/{val=$2;next} /signal/{sub(/^ +/,"");print "MAC Address: "val ORS $0;val=""}' Input_file