BASH - Contar o número de ocorrências de uma substring em uma string

0

Como posso contar o número de ocorrências de uma substring em uma string usando o Bash?

EXEMPLO:

Gostaria de saber quantas vezes essa substring ...

Bluetooth
         Soft blocked: no
         Hard blocked: no

... ocorre nessa string ...

0: asus-wlan: Wireless LAN
         Soft blocked: no
         Hard blocked: no
1: asus-bluetooth: Bluetooth
         Soft blocked: no
         Hard blocked: no
2: phy0: Wireless LAN
         Soft blocked: no
         Hard blocked: no
113: hci0: Bluetooth
         Soft blocked: no
         Hard blocked: no

OBSERVAÇÃO I: tentei várias abordagens com sed, grep, awk ... Nada parece funcionar quando temos strings com espaços e várias linhas.

OBSERVAÇÃO II: Sou um usuário do Linux e estou tentando uma solução que não envolva a instalação de aplicativos / ferramentas fora daqueles que normalmente são encontrados nas distribuições do Linux.

IMPORTANTE:

Eu gostaria de algo como o exemplo hipotético abaixo. Nesse caso, usamos duas variáveis do shell (Bash) .

EXEMPLO:

STRING="0: asus-wlan: Wireless LAN
         Soft blocked: no
         Hard blocked: no
1: asus-bluetooth: Bluetooth
         Soft blocked: no
         Hard blocked: no
2: phy0: Wireless LAN
         Soft blocked: no
         Hard blocked: no
113: hci0: Bluetooth
         Soft blocked: no
         Hard blocked: no"

SUB_STRING="Bluetooth
         Soft blocked: no
         Hard blocked: no"

awk -v RS='
Bluetooth
         Soft blocked: no
         Hard blocked: no
' 'NR==FNR{str=$0; next} {print gsub(str,"")}' "$STRING" "$SUB_STRING"

NOTA: Estamos usando o awk apenas para ilustrar!

    
por Eduardo Lucio 07.05.2018 / 07:03

1 resposta

2

Eu suponho que isso pode ser feito melhor com awk , mas isso é o melhor que posso oferecer.

grep -zo "Bluetooth\s*Soft blocked: no\s*Hard blocked: no" file_name | grep -c "Bluetooth"

-z faz grep tratar o arquivo inteiro como uma linha.

-o grava apenas a saída que correspondeu à string e não à linha inteira.
(no nosso caso com -z que significaria todo o arquivo)

\s corresponde a caracteres em branco e novas linhas.

A segunda instância de grep pesquisará apenas a palavra "Bluetooth" na saída da primeira chamada grep .

-c faz com que grep grave a contagem de regex correspondida, em vez das correspondências correspondentes.

    
por 07.05.2018 / 08:26