Feed de linha nos resultados do shell script usando o comando grep

1

Estou escrevendo um script de shell para grep something a partir de um arquivo de log e, em seguida, imprimo todos os resultados usando o comando echo .

Eu poderia fazer isso, mas suponha que o log contenha mais de uma instância da string de pesquisa e imprima todos os resultados em uma linha. É possível imprimir os resultados com alimentação de linha; se eu simplesmente executar o comando grep no shell, ele irá imprimir com alimentação de linha, então eu pensei com o shell script também funcionará da mesma maneira, mas claramente isso não está acontecendo.

Meus scripts de shell:

#!/bin/bash
messageStr='a senior leader of '$2
echo $messageStr
results='grep "$messageStr" $1'
echo "results= " $results

Meu arquivo de log:

A column written for ndtv.com by Ashutosh, a senior leader of Aam Aadmi Party or AAP, triggered protests from the opposition today and an order to appear before the country's top women's rights body, which said he has demeaned women.

a senior leader of Aam Aadmi Party or AAP

A column written for ndtv.com by Ashutosh, a senior leader of Aam Aadmi Party or AAP, triggered protests from the opposition today and an order to appear before the country's top women's rights body, which said he has demeaned women.

Resultados reais:

results=  A column written for ndtv.com by Ashutosh, a senior leader of Aam Aadmi Party or AAP, triggered protests from the opposition today and an order to appear before the country's top women's rights body, which said he has demeaned women. a senior leader of Aam Aadmi Party or AAP

Resultados esperados:

results=  A column written for ndtv.com by Ashutosh, a senior leader of Aam Aadmi Party or AAP, triggered protests from the opposition today and an order to appear before the country's top women's rights body, which said he has demeaned women. 
a senior leader of Aam Aadmi Party or AAP

Por favor, deixe-me saber se qualquer outra informação é necessária.

    
por hagrawal 05.09.2016 / 17:19

1 resposta

1

As variáveis não nomeadas são submetidas à divisão de palavras (depois que o parâmetro shell é expandido, espaços, tabulações e caracteres de nova linha são usados para dividir a variável expandida em argumentos separados) e globbing (expansão de símbolos curinga de shell). Como regra, você deve sempre citar duas vezes as variáveis do shell , a menos que queira especificamente a divisão de palavras e / ou globbing. Para mais informações, consulte o link

Se eu entendi sua pergunta corretamente, neste caso, você só precisa citar o parâmetro $results :

messageStr="a senior leader of $2"
echo "$messageStr"
results=$(grep "$messageStr" "$1")
echo "results=  $results"

A propósito, o uso de back-ticks é (efetivamente) obsoleto para a substituição de comando; é melhor usar $() .

Adendo : link fornece feedback muito útil ao desenvolver scripts de shell (por exemplo, destacando variáveis não-nomeadas).

    
por 05.09.2016 / 18:19