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
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
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
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
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
Tags bash grep awk sed shell-script