Como combinar palavras e ignorar múltiplos espaços?

2

A sintaxe a seguir deve corresponder ao "Servidor Ambari em execução", mas como combinar caso haja vários espaços entre as palavras? Como ignorar espaços entre palavras?

echo "Ambari Server      running"  | grep -i "Ambari Server running"
echo "Ambari     Server running"   | grep -i "Ambari Server running"
echo "     Ambari Server running"  | grep -i "Ambari Server running"

Os resultados esperados devem ser:

Ambari Server running
Ambari Server running
Ambari Server running
    
por yael 28.08.2017 / 07:29

4 respostas

3

Use tr com sua opção -s para compactar espaços consecutivos em espaços únicos e o grep o resultado disso:

$ echo 'Some   spacious  string' | tr -s ' ' | grep 'Some spacious string'
Some spacious string
    
por 28.08.2017 / 08:11
1

Use o operador Regex + para indicar um ou mais dos espaços de token precedentes, neste caso. Então, o padrão seria \+ :

echo "Ambari Server      running"  | grep -i "Ambari \+Server \+running"

Sugiro usar a classe de caractere [:blank:] para corresponder a qualquer espaço em branco horizontal, e não apenas a espaço simples, se você não tiver certeza:

echo "Ambari Server      running"  | grep -i "Ambari[[:blank:]]\+Server[[:blank:]]\+running"

Por outro lado, se você quiser manter apenas um espaço entre as palavras, use awk :

echo "Ambari Server      running"  | \
    awk '$1=="Ambari" && $2=="Server" && $3=="running" {$1=$1; print}'
  • $1=="Ambari" && $2=="Server" && $3=="running" corresponde aos três campos desejados

  • {$1=$1} reconstrói o registro com espaço como o novo separador

  • {print} imprime o registro

por 28.08.2017 / 07:34
1

Se você quiser apenas ignorar todo o espaço entre você pode usar echo your text |tr -d [[:space:]]| grep "yourtext" , mas a saída não terá espaço. Exemplo:

echo "Hi This   Is Test" |tr -d [[:space:]] |grep HiThisIsTest

Saída:

HiThisIsTest
    
por 28.08.2017 / 07:34
0

Para responder à questão principal de How to match words and ignore multiple spaces? Algo como o seguinte ajudará você a conseguir o que precisa:

echo "Ambari Server      running"  | tr '[:upper:]' '[:lower:]' | grep -E '\s*ambari\s+server\s+running\s*'

Ele pega a entrada e faz a letra minúscula e procura correspondências com letras minúsculas. Usamos \s* para 0 ou mais espaços em branco (portanto, incluiremos guias etc.) e \s+ para um ou mais espaços em branco.

Se sua entrada estava em um arquivo como foo2.txt abaixo:

Ambari Server      running 
Ambari     Server running
     Ambari Server running

Então você poderia fazer algo como:

cat foo2.txt | tr '[:upper:]' '[:lower:]' | grep -E '\s*ambari\s+server\s+running\s*'
ambari server      running
ambari     server running
     ambari server running

Se você está interessado apenas na contagem, você pode modificá-lo um pouco para ser assim:

cat foo2.txt | tr '[:upper:]' '[:lower:]' | grep -E '\s*ambari\s+server\s+running\s*' | wc -l
    
por 22.08.2018 / 16:10