Bagaimana saya bisa memonitor level dan frekuensi sinyal nirkabel dan mencatatnya dalam format csv?

8

Saya ingin menjalankan perintah iw dev wlan0 linkterus menerus setiap detik dan menyimpan output ke dalam csvfile.

Saya menggunakan perintah berikut:

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

Tetapi hasilnya disimpan log.csvdengan cara berikut:

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

Saya ingin output disimpan dengan cara di mana dua bidang dipisahkan oleh koma (sehingga mereka akan ditampilkan dalam kolom terpisah di editor seperti MS Excel) dan masing-masing dijalankan ke baris baru. The log.csvakan terlihat seperti ini (Anda dapat mengabaikan label, mereka hanya untuk penjelasan):

Signal  Frequency
-41     2412
-42     2412
-45     2412
-43     2412
engrasifkhan
sumber

Jawaban:

10

Saat berlari iw helpAnda melihat peringatan:

Jangan tidak screenscrape alat ini, kita tidak menganggap keluaran stabil.

Ada dua bagian di bawah ini: Pertama solusi untuk menghindari masalah Anda iwdan kedua jawaban untuk pertanyaan Anda. Keduanya bekerja dengan tradisional awkmaupun (default) GNU Awk.

Solusi untuk masalah Anda

Saya akan menggunakan iwconfigalih-alih iw:

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

Keluaran

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

Catatan

Saya bingung apakah Anda ingin nilai dipisahkan oleh ,atau lebih tepatnya tab (yang akan menjadi \t), saya memilih ,tanpa dan ruang sekitarnya di sini. Jika itu bukan apa yang Anda diinginkannya hanya mengubah s","fsesuai, sadalah Signaldan fyang Frequencynilai di sana.
Saya juga memindahkan pengalihan, dengan cara ini file tidak harus dibuka pada setiap kali jalankan tetapi hanya sekali.

Penjelasan awkbagian

  • -F'[ :=]+'- set pembatas bidang yang berbeda, di sini untuk satu atau lebih ( +) dari tiga karakter yang terlampir dalam tanda kurung
  • /Freq/{gsub("\\.","");f=$5}- sesuai dengan "Frek", ganti setiap titik dengan tidak ada apa-apa (karena frekuensi dalam iwconfigoutput menggunakan titik sebagai pemisah ribuan) dan menyimpan konten kolom kelima dalam variabelf
  • /Signal/{s=$7} - sejalan dengan "Sinyal", simpan konten kolom ketujuh dalam variabel s
  • END{print s","f}- setelah memproses input, printvariabel sdan fdengan koma literal di antara mereka

Jawab pertanyaan Anda

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

Keluaran

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

Penjelasan awkbagian

  • /freq/{f=$2}- sejalan dengan freq, simpan kolom kedua (spasi terpisah) dalam variabelf
  • /signal/{s=$2}- pada baris dengan signal, simpan kolom kedua dalam variabels
  • END{print s","f}- setelah memproses input, printvariabel sdan fdengan koma literal di antara mereka
pencuci mulut
sumber