Comment puis-je surveiller le niveau et la fréquence du signal sans fil et l'enregistrer au format csv?

8

Je veux exécuter la commande en iw dev wlan0 linkcontinu toutes les secondes et enregistrer la sortie dans un csvfichier.

J'utilise la commande suivante:

while sleep 1; do
  iw dev wlan0 link | grep 'freq:\|signal' | awk '{printf "%s ", $2, $3}' >> log.csv
done

Mais la sortie est enregistrée log.csvde la manière suivante:

2412 -41 2412 -42 2412 -45 2412 -43

Je veux que la sortie soit enregistrée de manière à ce que les deux champs soient séparés par une virgule (ils seront donc affichés dans des colonnes distinctes dans des éditeurs tels que MS Excel) et chacun s'exécutera sur une nouvelle ligne. Le log.csvdoit ressembler à ceci (vous pouvez ignorer les étiquettes, elles ne sont que pour explication):

Signal  Frequency
-41     2412
-42     2412
-45     2412
-43     2412
engrasifkhan
la source

Réponses:

10

Lors de l'exécution, iw helpvous voyez un avertissement:

Ne pas scrapper cet outil, nous ne considérons pas sa sortie comme stable.

Il y a deux sections ci-dessous: Premièrement, une solution à votre problème en évitant iwet deuxièmement une réponse à votre question. Les deux fonctionnent avec traditionnel awkainsi que (par défaut) GNU Awk.

Solution à votre problème

J'utiliserais iwconfigau lieu de iw:

while sleep 1; do
  iwconfig wlan0 | awk -F'[ :=]+' '/Freq/{gsub("\\.","");f=$5}/Signal/{s=$7}END{print s","f}'
done >>log.csv

Production

$ iwconfig wlan0 | awk -F'[ :=]+' '/Freq/{gsub("\\.","");f=$5}/Signal/{s=$7}END{print s","f}'
-44,2412

Remarques

Je suis confus si vous voulez que les valeurs soient séparées par ,ou plutôt un onglet (ce qui serait \t), j'ai choisi ,sans et les espaces environnants ici. Si ce n'est pas ce que vous vouliez juste changer en s","fconséquence, sc'est la Signalet fla Frequencyvaleur là-bas.
J'ai également déplacé la redirection, de cette façon, le fichier ne doit pas être ouvert à chaque exécution, mais une seule fois.

Explications de la awkpartie

  • -F'[ :=]+'- définit un délimiteur de champ différent, ici à un ou plusieurs ( +) des trois caractères entre crochets
  • /Freq/{gsub("\\.","");f=$5}- dans la ou les lignes avec «Freq», remplacez chaque point par rien (car la fréquence dans la iwconfigsortie utilise un point comme séparateur de milliers) et enregistrez le contenu de la cinquième colonne en variablef
  • /Signal/{s=$7} - dans la (les) ligne (s) avec «Signal», enregistrez le contenu de la septième colonne en variable s
  • END{print s","f}- après avoir traité l'entrée, printles variables set favec une virgule littérale entre elles

Répondez à votre question

while sleep 1; do
  iw dev wlan0 link | awk '/freq/{f=$2};/signal/{s=$2}END{print s","f}'
done >>log.csv

Production

$ iw dev wlan0 link | awk '/freq/{f=$2};/signal/{s=$2}END{print s","f}'
-43,2412

Explications de la awkpartie

  • /freq/{f=$2}- dans la ou les lignes avec freq, enregistrez la deuxième colonne (séparée par des espaces) dans la variablef
  • /signal/{s=$2}- dans la ou les lignes avec signal, enregistrez la deuxième colonne dans la variables
  • END{print s","f}- après avoir traité l'entrée, printles variables set favec une virgule littérale entre elles
dessert
la source