Làm cách nào tôi có thể theo dõi mức và tần số tín hiệu không dây và đăng nhập ở định dạng csv?


8

Tôi muốn chạy lệnh iw dev wlan0 linkliên tục mỗi giây và lưu kết quả đầu ra vào một csvtệp.

Tôi đang sử dụng lệnh sau:

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

Nhưng đầu ra được lưu log.csvtheo cách sau:

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

Tôi muốn đầu ra được lưu theo cách hai trường được phân tách bằng dấu phẩy (vì vậy chúng sẽ được hiển thị trong các cột riêng biệt trong các trình soạn thảo như MS Excel) và mỗi trường chạy vào một dòng mới. Các log.csvtrách nhiệm giống như thế này (Bạn có thể bỏ qua các nhãn, chúng chỉ là để giải thích):

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

Câu trả lời:


10

Khi chạy iw helpbạn thấy một cảnh báo:

Đừng không bỏ màn hình công cụ này, chúng tôi không coi ổn định sản lượng của nó.

hai phần dưới đây: Đầu tiên là giải pháp cho vấn đề của bạn tránh iwvà thứ hai là câu trả lời cho câu hỏi của bạn. Cả hai đều hoạt động với truyền thống awkcũng như (mặc định) GNU Awk.

Giải pháp cho vấn đề của bạn

Tôi sẽ sử dụng iwconfigthay vì iw:

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

Đầu ra

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

Ghi chú

Tôi đã bối rối liệu bạn có muốn các giá trị được phân tách bằng ,hoặc đúng hơn là một tab (sẽ là \t), tôi đã chọn ,không có và không gian xung quanh ở đây. Nếu đó không phải là những gì bạn muốn chỉ cần thay đổi s","fcho phù hợp, sSignalfcác Frequencygiá trị đó.
Tôi cũng đã chuyển hướng, theo cách này, tệp không phải được mở trong mỗi lần chạy mà chỉ một lần.

Giải thích về awkphần

  • -F'[ :=]+'- đặt một dấu phân cách trường khác nhau, ở đây thành một hoặc nhiều ( +) của ba ký tự được đặt trong dấu ngoặc vuông
  • /Freq/{gsub("\\.","");f=$5}- trong (các) dòng với Fre Freq, hãy thay thế mọi dấu chấm bằng không (vì tần số trong iwconfigđầu ra sử dụng dấu chấm làm dấu phân cách hàng nghìn) và lưu nội dung của cột thứ năm vào biếnf
  • /Signal/{s=$7} - trong (các) dòng có Tín hiệu Hồi, hãy lưu nội dung của cột thứ bảy trong biến s
  • END{print s","f}- sau khi xử lý đầu vào, printcác biến sfbằng dấu phẩy bằng chữ giữa chúng

Trả lời câu hỏi của bạn

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

Đầu ra

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

Giải thích về awkphần

  • /freq/{f=$2}- trong (các) dòng với freq, lưu cột thứ hai (khoảng cách được phân tách) trong biếnf
  • /signal/{s=$2}- trong (các) dòng với signal, lưu cột thứ hai trong biếns
  • END{print s","f}- sau khi xử lý đầu vào, printcác biến sfbằng dấu phẩy bằng chữ giữa chúng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.