eng*_*han 8 command-line wireless text-processing
我想iw dev wlan0 link每秒连续运行命令并将输出保存到csv文件中。
我正在使用以下命令:
while sleep 1; do
iw dev wlan0 link | grep 'freq:\|signal' | awk '{printf "%s ", $2, $3}' >> log.csv
done
Run Code Online (Sandbox Code Playgroud)
但是输出log.csv以以下方式保存:
2412 -41 2412 -42 2412 -45 2412 -43
Run Code Online (Sandbox Code Playgroud)
我希望以逗号分隔两个字段的方式保存输出(因此它们将显示在编辑器(如 MS Excel)中的单独列中)并且每个字段都运行到一个新行。该log.csv应是这样的(可以忽略的标签,他们只负责解释):
Signal Frequency
-41 2412
-42 2412
-45 2412
-43 2412
Run Code Online (Sandbox Code Playgroud)
des*_*ert 10
运行时,iw help您会看到警告:
难道不是屏幕抓取这个工具,我们不考虑它的输出稳定。
下面有两个部分:首先是避免问题的解决方案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
Run Code Online (Sandbox Code Playgroud)
$ iwconfig wlan0 | awk -F'[ :=]+' '/Freq/{gsub("\\.","");f=$5}/Signal/{s=$7}END{print s","f}'
-44,2412
Run Code Online (Sandbox Code Playgroud)
我很困惑你是想要,用制表符分隔值还是用制表符(这将是\t),我,在这里选择了没有和周围的空格。如果这不是您想要的s","f,s则相应地更改,是Signal和那里f的Frequency价值。
我还移动了重定向,这样文件不必在每次运行时打开,而只需打开一次。
awk部分说明-F'[ :=]+'– 设置不同的字段分隔符,此处为+方括号中的三个字符中的一个或多个 ( )/Freq/{gsub("\\.","");f=$5}– 在带有“Freq”的行中,将每个点替换为空(因为iwconfig输出中的频率使用点作为千位分隔符)并将第五列的内容保存在变量中f/Signal/{s=$7} – 在带有“信号”的行中,将第七列的内容保存在变量中 sEND{print s","f}– 处理输入后,print变量s和f它们之间的文字逗号$ iwconfig wlan0 | awk -F'[ :=]+' '/Freq/{gsub("\\.","");f=$5}/Signal/{s=$7}END{print s","f}'
-44,2412
Run Code Online (Sandbox Code Playgroud)
$ iw dev wlan0 link | awk '/freq/{f=$2};/signal/{s=$2}END{print s","f}'
-43,2412
Run Code Online (Sandbox Code Playgroud)
awk部分说明/freq/{f=$2}– 在带有 的行中freq,将第二列(空格分隔)保存在变量中f/signal/{s=$2}– 在带有 的行中signal,将第二列保存在变量中sEND{print s","f}– 处理输入后,print变量s和f它们之间的文字逗号| 归档时间: |
|
| 查看次数: |
2202 次 |
| 最近记录: |