ฉันจะตรวจสอบระดับสัญญาณไร้สายและความถี่และบันทึกในรูปแบบ csv ได้อย่างไร


8

ฉันต้องการรันคำสั่งiw dev wlan0 linkอย่างต่อเนื่องทุกวินาทีและบันทึกผลลัพธ์ลงในcsvไฟล์

ฉันกำลังใช้คำสั่งต่อไปนี้:

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

แต่เอาต์พุตจะถูกบันทึกlog.csvด้วยวิธีต่อไปนี้:

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

ฉันต้องการให้บันทึกผลลัพธ์ในวิธีที่ทั้งสองเขตข้อมูลคั่นด้วยเครื่องหมายจุลภาค (ดังนั้นพวกเขาจะปรากฏในคอลัมน์แยกต่างหากในโปรแกรมแก้ไขเช่น MS Excel) และแต่ละคนทำงานในบรรทัดใหม่ log.csvจะมีลักษณะเช่นนี้ (คุณสามารถละเว้นฉลากพวกเขาเป็นเพียงคำอธิบาย):

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

คำตอบ:


10

เมื่อใช้งานiw helpคุณจะเห็นคำเตือน:

อย่าไม่ screenscrape เครื่องมือนี้เราไม่ได้พิจารณาเสถียรภาพเอาท์พุท

มีสองส่วนด้านล่าง: แรกแก้ปัญหาของคุณหลีกเลี่ยงiwและสองคำตอบสำหรับคำถามของคุณ ทั้งสองทำงานร่วมกับแบบดั้งเดิมawkเช่นเดียวกับ GNU Awk(เริ่มต้น)

วิธีแก้ไขปัญหาของคุณ

ฉันจะใช้iwconfigแทนiw:

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

เอาท์พุต

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

หมายเหตุ

ฉันสับสนว่าคุณต้องการค่าคั่นด้วย,หรือมากกว่าแท็บ (ซึ่งจะเป็น\t) ฉันเลือก,โดยไม่ต้องและช่องว่างโดยรอบที่นี่ หากที่ไม่สิ่งที่คุณต้องการเพียงแค่เปลี่ยนs","fตามsเป็นSignalและค่ามี ฉันยังย้ายการเปลี่ยนเส้นทางด้วยวิธีนี้ไฟล์ไม่จำเป็นต้องเปิดในแต่ละครั้ง แต่เพียงครั้งเดียวfFrequency

คำอธิบายของawkส่วน

  • -F'[ :=]+'- ตั้งค่าตัวคั่นฟิลด์อื่นที่นี่เป็นหนึ่งหรือมากกว่า ( +) ของอักขระสามตัวที่อยู่ในวงเล็บเหลี่ยม
  • /Freq/{gsub("\\.","");f=$5}- ในบรรทัดด้วย“ Freq” แทนที่ทุกจุดโดยไม่มีอะไร (เพราะความถี่ในiwconfigเอาต์พุตใช้จุดเป็นตัวคั่นหลักพัน) และบันทึกเนื้อหาของคอลัมน์ที่ห้าในตัวแปรf
  • /Signal/{s=$7} - ในบรรทัดที่มี“ สัญญาณ” ให้บันทึกเนื้อหาของคอลัมน์ที่เจ็ดในตัวแปร s
  • END{print s","f}- หลังจากประมวลผลอินพุตprintตัวแปรsและfเครื่องหมายจุลภาคระหว่างตัวอักษร

ตอบคำถามของคุณ

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

เอาท์พุต

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

คำอธิบายของawkส่วน

  • /freq/{f=$2}- ในบรรทัดที่มีfreqให้บันทึกคอลัมน์ที่สอง (คั่นด้วยช่องว่าง) ในตัวแปรf
  • /signal/{s=$2}- ในบรรทัดที่มีsignalให้บันทึกคอลัมน์ที่สองในตัวแปรs
  • END{print s","f}- หลังจากประมวลผลอินพุตprintตัวแปรsและfเครื่องหมายจุลภาคระหว่างตัวอักษร
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.