awk -F" " 用大于 1 的空格分隔

awk -F" " 用大于 1 的空格分隔

我正在尝试解析其结果,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 命令。

相关内容