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ó.
Có 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, slà Signalvà fcá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 svà fbằ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 svà fbằng dấu phẩy bằng chữ giữa chúng