【问题标题】:Parsing iw wlan0 station dump output解析 iw wlan0 站转储输出
【发布时间】:2019-04-26 12:49:25
【问题描述】:

我知道这是其他帖子的类似问题。但我想解析 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

【问题讨论】:

  • 您能否在您的帖子中使用代码标签发布sudo iw wlan0 station dump 的输出,然后让我们知道?
  • 嗨@RavinderSingh13 我刚刚发布了结果。谢谢
  • 我在该输出中没有看到Frequency Signal Encryption 字符串,那么如果这些字符串不在其中,您的代码将如何工作,请告诉我您是哪个字段(及其名称)有兴趣让它们输出吗?例如--->tx packets
  • 我只尝试获取 Station 和 Signal。请不要介意频率等。我无法弄清楚如何使用 Signal 显示 Station (mac 地址) ..

标签: bash parsing awk


【解决方案1】:

EDIT5: 因为你没有告诉过 mac 地址可以在字符串 station 或字符串 MAC Address 之后找到,所以我之前的代码只寻找station 字符串现在我添加了逻辑来检查两者。还要考虑到&lt;------- 仅用于理解目的,并不存在于 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 获得 LOWEST 信号值,可以尝试跟随。

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 再次改变了要求并告诉所有站最好的信号值应该是那时尝试关注。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 2021-04-01
  • 2021-02-23
  • 2020-12-17
  • 2019-01-22
相关资源
最近更新 更多