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