我想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
答案1
运行时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
和那里的f
值Frequency
。
我还移动了重定向,这样文件就不必在每次运行时都打开,而只需打开一次。
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
它们之间用逗号隔开