Eu tenho várias linhas recuperadas de um arquivo após executar o comando grep da seguinte maneira:
var=`grep xyz abc.txt`
Digamos que eu tenha 10 linhas, que consiste em xyz como resultado.
Agora eu preciso processar cada linha que recebi como resultado do comando grep. Como proceder para isso?
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")Respostas:
Uma das maneiras fáceis é não armazenar a saída em uma variável, mas iterar diretamente sobre ela com um loop while / read.
Algo como:
Existem variações nesse esquema, dependendo exatamente do que você procura.
Se você precisar alterar variáveis dentro do loop (e deixar essa alteração visível fora dele), poderá usar a substituição de processo, conforme indicado na resposta de fedorqui :
fonte
while read p || [[ -n $p ]]; do ...
(emprestado de stackoverflow.com/questions/1521462/... )Você pode
while read
executar o seguinte loop, que será alimentado pelo resultado dogrep
comando usando a chamada substituição de processo: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 deread -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)? :Em relação à substituição do processo, é explicado na página de hackers do bash :
fonte
for
versão. Tentei fazer um loop"${$(grep xyz abc.txt)[@]}"
como em stackoverflow.com/a/14588210/1983854, mas não conseguiu. Então, eu apenas deixo a primeira versão.zsh
, onde esse tipo de aninhamento provavelmente funciona).while IFS= read -r result <&3
edone 3< <(grep ...
Eu sugeriria usar awk em vez de grep + outra coisa aqui.
awk '$0~/xyz/{ //your code goes here}' abc.txt
fonte
//your code goes here
?Sem nenhuma iteração com a opção --line-buffered grep:
Exemplo da vida real com um comando de depuração do roteador do Symfony PHP Framework, para grep todas as rotas relacionadas à "api":
fonte
tail -f some.log
, no meu caso) ...Muitas vezes, a ordem do processamento não importa. O GNU Parallel é feito para esta situação:
Se o seu processamento for mais parecido com:
e
myprogram
é lento, você pode executar:fonte
Repita os resultados grep com um loop while / read. Gostar:
fonte
Para quem procura uma linha:
fonte