Анализ вывода дампа станции iw wlan0 - PullRequest
0 голосов
/ 24 ноября 2018

Я знаю, что это аналогичный вопрос из других сообщений.Но я хотел бы разобрать 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-адрес) пример изображения

-

Последний результат кода (выбранный сигнал не соответствует 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

1 Ответ

0 голосов
/ 24 ноября 2018

РЕДАКТИРОВАТЬ5: Поскольку вы НЕ сказали, что MAC-адрес может быть найден либо после строки station, либо после строки MAC Address, поэтому мои предыдущие коды искали только 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


РЕДАКТИРОВАТЬ3: (Это решение заключается в получении ВЫСОКОГО значения сигнала) ДобавлениеЧетвёртый ответ, поскольку 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
...