Como ler um arquivo linha por linha

Novembro 2016



Preâmbulo


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 ! O que não é o objetivo da coisa...

Exemplo de saída com o ciclo vicioso "FOR" :
for line in $(cat file.txt); do echo "$line" ; done 
Esta 
é 
a 
linha 
n° 
1 
Esta 
é 
a 
linha 
n° 
2 
Esta 
[...]


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 loop. 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 
de 
   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


Saída na tela (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ê pode, a partir de um arquivo bem estruturado (como um caderno de endereços ou /etc/passwd por exemplo), recuperar os valores de cada campo e distribuí-los à diversas variáveis com o comando "read". No entanto, não esqueça de definir a variável "IFS", o separador de campo correto (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

Vantagem


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, ou seja, ele anula 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  # backup do separador de campo 
IFS=$'n'     # novo separador de campo, o caractere de fim de linha 
for ligne in $(cat arquivo) 
do 
   comando 
done 
IFS=$old_IFS     # restabelecimento do separador de campo padrão



Tradução feita por Lucia Maurity y Nouira

Veja também :
Este documento, intitulado « Como ler um arquivo linha por linha »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.