Lors de l'exécution, iw help
vous 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 iw
et deuxièmement une réponse à votre question. Les deux fonctionnent avec traditionnel awk
ainsi que (par défaut) GNU Awk
.
Solution à votre problème
J'utiliserais iwconfig
au 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","f
conséquence, s
c'est la Signal
et f
la Frequency
valeur 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 awk
partie
-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 iwconfig
sortie 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, print
les variables s
et f
avec 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 awk
partie
/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, print
les variables s
et f
avec une virgule littérale entre elles