Você pode while read
executar o seguinte loop, que será alimentado pelo resultado do grep
comando usando a chamada substituição de processo:
while IFS= read -r result
do
#whatever with value $result
done < <(grep "xyz" abc.txt)
Dessa forma, você não precisa armazenar o resultado em uma variável, mas "injeta" diretamente sua saída no loop.
Observe o uso IFS=
e de read -r
acordo com as recomendações do BashFAQ / 001: Como posso ler um arquivo (fluxo de dados, variável) linha por linha (e / ou campo por campo)? :
A opção -r para ler impede a interpretação de barra invertida (geralmente usada como um par de nova linha de barra invertida, para continuar em várias linhas ou para escapar dos delimitadores). Sem essa opção, quaisquer barras invertidas sem escape na entrada serão descartadas. Você quase sempre deve usar a opção -r com read.
No cenário acima, IFS = impede o corte de espaços em branco à esquerda e à direita. Remova-o se desejar esse efeito.
Em relação à substituição do processo, é explicado na página de hackers do bash :
A substituição de processo é uma forma de redirecionamento em que a entrada ou saída de um processo (alguma sequência de comandos) aparece como um arquivo temporário.
grep -o
desse tipo de coisa. A-o
bandeira retornará apenas o texto que corresponder, com uma correspondência por linha de saída. (Não é exaustiva, por issoecho aaa |grep 'a*'
só lhe dá "aaa" e omite as três partidas parciais "", "a" e "aa")