Pesquisa de site

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.