awk -F “” delimitar por espaço maior que 1

4

Estou tentando analisar os resultados de nmcli dev wifi , o que produz um resultado como este:

*  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      ▂▄__            

Inicialmente, eu estava apenas analisando usando awk -F" " , o que funcionou para quase todos os casos. Eu estou achando que qualquer rede wifi com a space está completamente descartada.

Então, em vez disso, uso dois espaços, em vez de um, isso não produziu os resultados esperados. Como posso consistentemente analisar as colunas na saída acima?

O script atual é algo assim:

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')
    
por Philip Kirkbride 19.10.2017 / 20:57

2 respostas

3

Analise a primeira linha para encontrar em qual posição cada coluna é iniciada e, em seguida, analise as outras linhas com base nos números das colunas. Por exemplo, o script a seguir imprime a coluna 2, que é o 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
    }'

Dependendo do que você deseja fazer, chamar o awk várias vezes pode não ser a melhor solução. Tenha em mente que você pode executar comandos shell a partir do awk com a função system .

    
por 19.10.2017 / 21:25
2
awk -F' {2,}' # means - two or more spaces.

ou

awk -F'  +' # means - one space, then one or more spaces.

Estes comandos significam o mesmo - use 2 ou mais espaços como delimitador de campos.

    
por 20.10.2017 / 16:04