Diferentes maneiras de ler arquivos em script Bash usando loop While
Este artigo é sobre como ler arquivos em scripts bash usando um loop while. Ler um arquivo é uma operação comum em programação. Você deve estar familiarizado com os diferentes métodos e qual método é mais eficiente de usar. No bash, uma única tarefa pode ser realizada de várias maneiras, mas sempre há uma maneira ideal de realizar a tarefa e devemos segui-la.
Antes de ver como ler o conteúdo do arquivo usando o loop while, vamos dar uma breve introdução sobre como o loop while funciona. O loop While avalia uma condição e itera sobre um determinado conjunto de códigos quando a condição é verdadeira.
while [ CONDITION ]
do
code block
done
Vamos analisar a sintaxe do loop while.
- loop while deve começar com uma palavra-chave while seguida por uma condição.
- Uma condição deve ser colocada entre [ ] ou [[ ]]. A condição deve sempre retornar verdadeira para que o loop seja executado.
- O bloco de código real será colocado entre do e done.
NUMBER=0
while [[ $NUMBER -le 10 ]]
do
echo " Welcome ${NUMBER} times "
(( NUMBER++ ))
done
Este é um exemplo muito simples, onde o loop é executado até que NUMBER não seja maior que 10 e imprime a instrução echo.
Junto com while usaremos o comando read para ler o conteúdo de um arquivo linha por linha. Abaixo está a sintaxe de como os comandos while e read são combinados. Agora existem diferentes maneiras de passar o arquivo como entrada e veremos todas elas.
SYNTAX
while read VARIABLE
do
code
done
Tubulação no Linux
Normalmente usaremos o comando cat para visualizar o conteúdo do arquivo no terminal. Além disso, canalizaremos a saída do comando cat para outros comandos como grep, sort, etc.
Da mesma forma, usaremos o comando cat aqui para ler o conteúdo do arquivo e canalizá-lo para um loop while. Para demonstração, estou usando o arquivo /etc/passwd mas não é aconselhável mexer com este arquivo, então faça uma cópia de backup deste arquivo e brinque com ele se desejar.
cat /etc/passwd | while read LREAD
do
echo ${LREAD}
done
Vamos detalhar o que acontecerá quando o código acima for enviado.
- cat /etc/passwd lerá o conteúdo do arquivo e o passará como entrada através do canal.
- O comando read lê cada linha passada como entrada do comando cat e a armazena na variável LREAD.
- O comando read lerá o conteúdo do arquivo até que EOL seja interpretado.
Você também pode usar outros comandos como head, tail e canalizá-lo para o loop while.
head -n 5 /etc/passwd | while read LREAD
do
echo ${LREAD}
done
Redirecionamento de entrada no Linux
Podemos redirecionar o conteúdo do arquivo para o loop while usando o operador de redirecionamento de entrada (<)
.
while read LREAD
do
echo ${LREAD}
done < /etc/passwd | head -n 5
Você também pode armazenar o nome do arquivo em uma variável e passá-lo por meio de um operador de redirecionamento.
FILENAME="/etc/passwd"
while read LREAD
do
echo ${LREAD}
done < ${FILENAME}
Você também pode passar nomes de arquivos como argumento para seu script.
while read LREAD
do
echo ${LREAD}
done < $1 | head -n 5
Separador de Campo Interno
Você pode trabalhar com diferentes tipos de formatos de arquivo (CSV, TXT, JSON) e pode querer dividir o conteúdo do arquivo com base em um delimitador personalizado. Neste caso, você pode usar “Separador de campo interno (IFS)” para dividir o conteúdo do arquivo e armazená-lo em variáveis.
Deixe-me demonstrar como funciona. Dê uma olhada no arquivo /etc/passwd que tem dois pontos (:)
como delimitador. Agora você pode dividir cada palavra de uma linha e armazená-la em uma variável separada.
No exemplo abaixo, estou dividindo o arquivo /etc/passwd com dois pontos como separador e armazenando cada divisão em variáveis diferentes.
while IFS=":" read A B C D E F G
do
echo ${A}
echo ${B}
echo ${C}
echo ${D}
echo ${E}
echo ${F}
echo ${G}
done < /etc/passwd
Exibi apenas uma linha dividida na captura de tela acima, considerando o tamanho da captura de tela.
Linhas vazias no Linux
Linhas vazias não são ignoradas quando você faz um loop pelo conteúdo do arquivo. Para demonstrar isso, criei um arquivo de amostra com o conteúdo abaixo. Existem 4 linhas e poucas linhas vazias, espaços em branco à esquerda, espaços em branco à direita, caracteres de tabulação na linha 2 e alguns caracteres de escape (\n e \t).
while read LREAD
do
echo ${LREAD}
done < testfile
Veja o resultado, a linha em branco não é ignorada. Além disso, uma coisa interessante a se notar é como os espaços em branco são cortados pelo comando read. Uma maneira simples de ignorar linhas em branco ao ler o conteúdo do arquivo é usar o operador test com o sinalizador -z
que verifica se o comprimento da string é zero. Agora vamos repetir o mesmo exemplo, mas desta vez com um operador de teste.
while read LREAD
do
if [[ ! -z $LREAD ]]
then
echo ${LREAD}
fi
done < testfile
Agora, na saída, você pode ver que as linhas vazias são ignoradas.
Personagens de fuga
Caracteres de escape como \n
, \t
, \c
não serão impressos durante a leitura de um arquivo. Para demonstrar isso, estou usando o mesmo arquivo de exemplo que possui poucos caracteres de escape.
while read LREAD
do
echo ${LREAD}
done < testfile
Você pode ver na saída que os caracteres de escape perderam seu significado e apenas n e t são impressos em vez de \n
e \t
. Você pode usar -r
para evitar a interpretação de barra invertida.
while read -r LREAD
do
echo ${LREAD}
done < testfile
É isso neste artigo. Gostaríamos muito de receber sua resposta se houver algum feedback ou dica. Seu feedback é o que nos ajuda a criar um conteúdo melhor. Continue lendo e continue apoiando.