Como ler um arquivo linha por linha

Novembro 2017

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.
Artigo original publicado por deri58. Tradução feita por pintuda. Última modificação: 21 de novembro de 2017 às 09:58 por Pedro.CCM.
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 (br.ccm.net) ao utilizar este artigo.