ao escrever programas Bash, irá por vezes encontrar-se em situações em que precisa de ler um ficheiro linha a linha. Por exemplo, você pode ter um arquivo de texto contendo dados que devem ser processados pelo script.
neste tutorial, vamos discutir como ler um arquivo linha por linha na Bash.,
a Leitura de um Arquivo linha Por Linha, Sintaxe #
A maioria sintaxe geral para a leitura de um arquivo linha a linha é o seguinte:
while IFS= read -r line; do printf '%s\n' "$line"done < input_file
ou o equivalente a única versão de linha:
while IFS= read -r line; do printf '%s\n' "$line"; done < input_file
Como funciona?
o ficheiro de entrada (input_file
) é o nome do ficheiro redireccionado para o ciclo de while. The read
command processes the file line by line, assigning each line to theline
variable. Uma vez que todas as linhas são processadas, o laço while termina.,
Por omissão, o comando read
interpreta a barra invertida como um carácter de escape e remove todos os espaços brancos iniciais e finais, que por vezes podem causar um comportamento inesperado. Para desactivar a fuga da barra invertida, estamos a invocar o comando com a opção -r
, e para desactivar a limpeza, o separador interno do campo (IFS
) está limpo.
estamos usando em vez de echo
para tornar o código mais portátil e evitar comportamentos indesejados., Por exemplo, se a linha contiver valores como “-e”, será tratada como uma opção echo.
lendo uma linha de arquivo por linha exemplos #
vamos dar uma olhada no seguinte exemplo. Suponha que temos um arquivo chamado distros.txt
que contém uma lista de algumas das mais populares distribuições Linux, e seus gerenciadores de pacotes separados com vírgula (,
):
Ubuntu,aptDebian,aptCentOS,yumArch Linux,pacmanFedora,dnf
Para ler o arquivo linha por linha, você deve executar o seguinte código no seu terminal:
while IFS= read -r line; do printf '%s\n' "$line"done < distros.txt
O código lê o arquivo linha a linha, atribui a cada linha a uma variável, e imprime-o. Basicamente, você veria o mesmo resultado como se mostrasse o conteúdo do ficheiro usando o comando cat
.
E se quiser imprimir apenas as distribuições que usam o apt?, Uma forma seria o uso de if
instrução e verifique se a linha contém o apt subseqüência de caracteres :
while IFS= read -r line; do if ]; then printf '%s\n' "$line" fidone < distros.txt
Ubuntu,aptDebian,apt
durante a leitura de um arquivo linha por linha, você também pode passar mais de uma variável para o read
comando, que vai 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 remanescentes são atribuídos à última variável.,
No exemplo a seguir, temos um conjunto de IFS
uma vírgula (,
) e passar duas variáveis distro
e pm
read
comando.,erything a partir do início da linha até a primeira vírgula será atribuído à primeira variável (distro
), e o restante da linha será atribuído a segunda variável (pm
):
while IFS=, read -r distro pm; do printf '%s is the package manager for %s\n' "$pm" "$distro"done < distros.txt
apt is the package manager for Ubuntuapt is the package manager for Debianyum is the package manager for CentOSpacman is the package manager for Arch Linuxdnf is the package manager for Fedora
Alternativa de Leitura de Arquivo Métodos #
a Utilização de um Processo de Substituição #
Processo de substituição é um recurso que permite que você use a saída do comando como de um arquivo:
while IFS= read -r line; do printf '%s\n' "$line"done < <(cat input_file )
Usando um Aqui String #
Aqui Seqüência de caracteres é uma variante do documento Aqui ., A cadeia de caracteres (cat input_file )
mantém as quebras de linha:
while IFS= read -r line; do printf '%s\n' "$line"done <<< $(cat input_file )
Usando o Arquivo de descritor de #
Você também pode fornecer a entrada para o loop usando um descritor de arquivo:
while IFS= read -r -u9 line; do printf '%s\n' "$line"done 9< input_file
Ao trabalhar com descritores de arquivo , use um número entre 4 e 9 para evitar o conflito com concha interna de descritores de arquivo.
Conclusion #
In Bash, we can read a file line-by-line using a while loop and the read
command.
Deixe uma resposta