Você está na página 1de 4

Como ler um arquivo linha por linha

Junho 2014

Como ler um arquivo linha por linha


Prembulo
Loop WHILE
Sintaxe
Exemplo
Dicas
Vantagem
Loop FOR
Sintaxe

Prembulo
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 avaliao, no de cada linha do arquivo mas, de cada palavra ! O que no o
objetivo da coisa... Exemplo de sada 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 soluo 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 varivel "$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 mtodo mais prtico 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 instrues 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
Sada 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 endereos ou
/etc/passwd por exemplo), recuperar os valores de cada campo e distribu-los diversas
variveis com o comando "read". No entanto, no esquea de definir a varivel "IFS", o
separador de campo correto (espao padro). 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 "Configurao : $i"; done < <(echo -e "anabnc")

Loop FOR
Apesar do loop "while" ser o mtodo mais simples, ele tem uma grande desvantagem, ou seja,
ele anula a formatao das linhas e, principalmente, dos espaos e tabulaes ! Felizmente, o
loop "FOR" associado a uma mudana do IFS permite manter a estrutura do documento de
sada.

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 padro
Traduo feita por Lucia Maurity y Nouira
Este documento, intitulado Como ler um arquivo linha por linha a partir de Kioskea (pt.kioskea.net) est
disponibilizado sob a licena Creative Commons. Voc pode copiar, modificar cpias desta pgina, nas condies
estipuladas pela licena, como esta nota aparece claramente.