O seguinte extrai algumas dezenas de linhas em uma variável, mas de alguma forma todas elas são colocadas juntas em uma única linha. Ou seja, eles perdem o caractere de nova linha original:
ALL_FOUND_LINES=$(find "$TEMP" -type f -name "debug.log*" | xargs -I {} grep -F "STARTING HOST " {})
Existe uma maneira de manter o caractere de nova linha em uma declaração como a acima?
Se você estiver testando isso com
então não estou surpreso que todas as novas linhas tenham desaparecido, pois o shell dividiria o valor em
$ALL_FOUND_LINES
espaços, guias e novas linhas (por padrão) em palavras (e depois expandiria ainda mais cada palavra por meio da geração de nome de arquivo (globbing)). Ele faz isso desde que a expansão não seja aspas. Oecho
utilitário então obtém uma lista de palavras que imprime em uma única linha.Um teste melhor seria
Observe a citação da expansão variável. Para a escolha de
printf
overecho
, veja Por que printf é melhor que echo? .Seu comando pode ser melhorado em
Aqui, em vez de passar os nomes dos arquivos para
xargs
, deixamosfind
executargrep
diretamente em tantosdebug.log*
arquivos quanto possível de cada vez. Observe que se livrar dexargs
não resolve seu problema de novas linhas, poisxargs
não teve nada a ver com isso. Isso aceleraria um pouco as coisas, pois envolve menos invocações degrep
.Veja também Entendendo a opção -exec de `find` .
Se você precisar fazer algo com cada uma das linhas encontradas, poderá fazer um loop sobre elas assim:
(ou substitua o loop while por qualquer outra etapa de processamento que você precise realizar). Portanto, nunca há necessidade de armazenar todos os dados em uma variável como uma string delimitada por nova linha.
Veja também Entendendo "IFS= read -r line"
homem xargs