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