3
Obrigado

Algumas palavras de agradecimento nunca são demais.

Como ler um arquivo linha por linha


Um dos erros mais comuns no aprendizado dos scripts bash no GNU/Linux para ler um arquivo, linha por linha, é usar um loop FOR (for line in $(cat file.txt); do...) que, neste exemplo, leva a uma avaliação, não de cada linha do arquivo, mas, de cada palavra.


Exemplo de um loop FOR

for line in $(cat file.txt); do echo "$line" ; done 
Esta
é
a
linha

1
Esta
é
a
linha

2
Etc.
[...]

A solução consiste em utilizar um loop while ligado ao comando interno read. No entanto, você pode obter o mesmo resultado com um loop For, mas você deverá trocar o valor da variável $IFS (Internal Field Separator - Separador do campo interno) antes de executar o looping Isto é o que veremos a seguir.

Loop while

O loop while continua a ser o método mais prático e simples para ler um arquivo linha por linha.

Sintaxe

while read linha 
do
comando
done < arquivo

Exemplo:

O arquivo de origem:

Esta é a linha n° 1 
Esta é a linha n° 2
Esta é a linha n° 3
Esta é a linha n° 4
Esta é a linha n° 5

As instruções em linha de comando:

while read line; do echo -e "$linen"; done < file.txt

Ou em um script bash:

#! /bin/bash 

while read line
do
echo -e "$linen"
done < file.txt

A saída na tela será (stdout):

Esta é a linha n° 1 

Esta é a linha n° 2

Esta é a linha n° 3

Esta é a linha n° 4

Esta é a linha n° 5

Dicas

Você também pode, a partir de um arquivo bem estruturado (como um caderno de endereços ou /etc/passwd, por exemplo), obter os valores de cada campo e distribuí-los para diversas variáveis com o comando read. No entanto, não se esqueça de definir a variável IFS, o separador de campo adequado (espaço padrão).

Exemplo:

#! /bin/bash 

while IFS=: read user pass uid gid full home shell
do
echo -e "$full :n
Pseudo : $usern
UID :t $uidn
GID :t $gidn
Home :t $homen
Shell :t $shellnn"
done < /etc/passwd

Complemento

while read i; do echo -e "configuração : $i"; done < <(echo -e "anabnc")

Loop FOR

Apesar do loop while ser o método mais simples, ele tem uma grande desvantagem, a de eliminar a formatação das linhas e, principalmente, dos espaços e tabulações. Felizmente, o loop FOR associado a uma mudança do IFS permite manter a estrutura do documento de saída.

Sintaxe

oldIFS=$IFS  # mantém o separador de campo 
IFS=$'n' # novo separador de campo, o caractere de fim de linha
for linha in $(cat arquivo)
do
comando
done
IFS=$old_IFS # restabelece o separador de campo padrão

Foto: © Linux.

Veja também

Artigo original publicado por . Tradução feita por Lucia Maurity y Nouria. Última modificação: por Pedro Muxfeldt.

Este documento, intitulado 'Como ler um arquivo linha por linha', está disponível sob a licença Creative Commons. Você pode copiar e/ou modificar o conteúdo desta página com base nas condições estipuladas pela licença. Não se esqueça de creditar o CCM (https://br.ccm.net/) ao utilizar este artigo.
1 vote - 5.0 /5

1 Comentário

-
Parabéns ao senhor Jean-François Pillou e equipe CCM pelo post objetivo e que muito me ajudou para entender porque meu script estava lendo todas as palavras e não as linhas. Eu estava usando o FOR. Obrigada.