Android

Como ler um arquivo linha por linha no bash

Shell Scripting - Comando read - Ler dados do teclado e de arquivos - 26

Shell Scripting - Comando read - Ler dados do teclado e de arquivos - 26

Índice:

Anonim

Ao escrever scripts Bash, às vezes você se encontra em situações em que precisa ler um arquivo linha por linha. Por exemplo, você pode ter um arquivo de texto contendo dados que devem ser processados ​​pelo script.

Neste tutorial, discutiremos como ler um arquivo linha por linha no Bash.

Lendo uma sintaxe de linha por linha de arquivo

A sintaxe mais geral para ler um arquivo linha por linha é a seguinte:

while IFS= read -r line do echo "$line" done < input_file

ou a versão equivalente de linha única:

while IFS= read -r line; do echo $line; done < input_file

Como funciona?

O arquivo de entrada ( input_file entrada) é o nome do arquivo que você deseja abrir para leitura pelo comando read . O comando read lê o arquivo linha por linha, atribuindo cada linha à variável de line . Depois que todas as linhas forem processadas, o loop while será encerrado. O separador de campo interno ( IFS ) é definido como a cadeia nula para preservar os espaços em branco iniciais e finais, que é o comportamento padrão do comando read .

Lendo um arquivo Linha por linha

Vamos dar uma olhada no exemplo a seguir. Suponha que tenhamos um arquivo chamado distros.txt contém uma lista de algumas das distribuições Linux mais populares e seus gerenciadores de pacotes separados por vírgula ( , ):

distros.txt

Ubuntu, apt Debian, apt CentOS, yum Arch Linux, pacman Fedora, dnf

Para ler o arquivo linha por linha, você executaria o seguinte código no seu terminal:

while IFS= read -r line do echo "$line" done < distros.txt

O código lerá o arquivo por linha, atribuirá cada linha a uma variável e ecoará a variável. Basicidade, você veria a mesma saída como se exibisse o conteúdo do arquivo usando o comando cat.

E se você quiser imprimir apenas as distribuições que usam o apt? Uma maneira seria usar a instrução if e verificar se a linha contém a substring apt:

while IFS= read -r line do if]; then echo "$line" fi done < distros.txt

Ubuntu, apt Debian, apt

Ao ler o arquivo linha por linha, você também pode passar mais de uma variável para o comando read, que dividirá a linha em campos com base no IFS . O primeiro campo é atribuído à primeira variável, o segundo à segunda variável e assim por diante. Se houver mais campos do que variáveis, os campos restantes serão atribuídos à última variável.

No exemplo a seguir, estamos definindo o IFS como vírgula ( , ) e passando duas variáveis distro e pm para o comando read. Tudo, desde o início da linha até a primeira vírgula será atribuído à primeira variável ( distro ) e o restante da linha será atribuído à segunda variável ( pm ):

while IFS=, read -r distro pm do echo "$pm" is the package manager for "$distro" done < distros.txt

apt is the package manager for Ubuntu apt is the package manager for Debian yum is the package manager for CentOS pacman is the package manager for Arch Linux dnf is the package manager for Fedora

Métodos alternativos de leitura de arquivos

Usando uma substituição de processo

A substituição do processo permite passar a saída do comando como um nome de arquivo:

while IFS= read -r line do echo "$line" done < <(cat input_file)

Usando uma String Here

Here String é uma variante do documento Here. A string (cat input_file) manterá as novas linhas:

while IFS= read -r line do echo "$line" done <<< $(cat input_file)

Usando o descritor de arquivo

Você também pode fornecer a entrada para o loop usando um descritor de arquivo:

while IFS= read -r -u9 line do echo "$line" done 9< input_file

Ao trabalhar com descritores de arquivos, use um número entre 4 e 9 para evitar conflitos com os descritores de arquivos internos do shell.

Conclusão

No Bash, podemos ler um arquivo linha por linha, fornecendo o nome do arquivo como uma entrada para um loop de leitura while.

terminal bash