เมื่อใช้งาน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เครื่องหมายจุลภาคระหว่างตัวอักษร