我正在尝试解析其结果,nmcli dev wifi
产生如下结果:
* SSID MODE CHAN RATE SIGNAL BARS SECURITY
Prk Infra 11 54 Mbit/s 99 ▂▄▆█
VIDEOTRON2255 Infra 11 54 Mbit/s 67 ▂▄▆_ WPA1 WPA2
a space Infra 6 54 Mbit/s 65 ▂▄▆_ WPA2
* TNCAP4D0B18 Infra 11 54 Mbit/s 52 ▂▄__
最初我只是使用awk -F" "
它来解析几乎所有情况。我发现任何带有 wifi 网络的设备a space
都完全无法正常工作。
因此,我尝试使用两个空格而不是一个空格,但这没有产生我预期的结果。如何一致地解析上述输出中的列?
当前的脚本是这样的:
nmcli dev wifi | sed 's/\*//g' > /tmp/scan
networks=$(cat /tmp/scan | awk -F" " '{print $1}' | sed '1d')
# ...
bars=$(cat /tmp/scan | awk -F" " '{print $6}' | sed '1d')
答案1
awk -F' {2,}' # means - two or more spaces.
或者
awk -F' +' # means - one space, then one or more spaces.
此命令的含义相同 - 使用 2 个或更多空格作为字段分隔符。
答案2
解析第一行以查找每列开始的位置,然后根据列号解析其他行。例如,以下脚本打印第 2 列,即 SSID。
nmcli_output=$(nmcli dev wifi)
printf %s\\n "$nmcli_output" | awk -v column=2 '
NR==1 {
i=1; p=1;
while(match($0,/^[^ ]+ +/)) {
a[i++] = p;
p += RLENGTH;
$0 = substr($0, RLENGTH+1);
}
}
NR!=1 {
text = substr($0, a[column], a[column+1] ? a[column+1]-a[column] : length);
sub(text, / +$/, "");
print text
}'
根据您想要执行的操作,多次调用 awk 可能不是最佳解决方案。请记住,您可以使用该system
函数从 awk 运行 shell 命令。