Maneiras diferentes de ler o arquivo em scripts bash usando o loop while

Maneiras diferentes de ler o arquivo em scripts bash usando o loop while

Este artigo é sobre como ler arquivos em scripts bash usando um enquanto loop. Ler um arquivo é uma operação comum na programação. Você deve estar familiarizado com métodos diferentes e qual método é mais eficiente para usar. Em Bash, uma única tarefa pode ser alcançada 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 enquanto loop, Uma cartilha rápida sobre como o loop funciona. Enquanto o loop avalia uma condição e itera sobre um determinado conjunto de códigos quando a condição é verdadeira.

Enquanto [condição] faça o bloco de código feito 

Vamos quebrar enquanto loop sintaxe.

  • enquanto loop deve começar com um tempo a palavra -chave seguida por uma condição.
  • A doença deve ser fechado dentro [] ou [[]]. A condição deve sempre retornar verdadeira para que o loop seja executado.
  • O bloco real de código será colocado entre fazer e feito.
Número = 0 enquanto [[$ número -le 10]] faça eco "Bem -vindo $ número vezes" ((número ++)) feito 
Enquanto loop

Este é um exemplo muito simples, onde o laço executa até NÚMERO não é maior que 10 e imprime a declaração de eco.

Juntamente com enquanto Vamos usar o ler comando para ler o conteúdo de uma linha de arquivo por linha. Abaixo está a sintaxe de como enquanto e ler Os comandos são combinados. Agora existem maneiras diferentes de passar o arquivo como entrada e veremos todos eles.

# Sintaxe enquanto a variável lida faz código feito 

Tubulação no Linux

Normalmente usaremos o comando CAT para visualizar o conteúdo do arquivo do terminal. Além disso, vamos colocar a saída do comando gato para outros comandos como Grep, classificação, etc.

Da mesma forma, usaremos o comando gato Aqui para ler o conteúdo do arquivo e transmitir -o para um enquanto laço. Para demonstração, estou usando /etc/passwd arquivo, mas não é aconselhável mexer com este arquivo, então pegue uma cópia de backup deste arquivo e jogue com ele se desejar.

gato /etc /passwd | Enquanto leia Lread do eco $ lread feito 
Tubulação no Linux

Vamos quebrar o que acontecerá quando o código acima for enviado.

  • gato /etc /passwd lerá o conteúdo do arquivo e o passará como entrada através do tubo.
  • ler O comando lê cada linha passada como entrada do comando CAT e o armazena no Lread variável.
  • ler O comando lerá o conteúdo do arquivo até EOL é interpretado.

Você também pode usar outros comandos como cabeça, cauda e tubar -o para o loop.

Cabeça -n 5 /etc /passwd | Enquanto leia Lread do eco $ lread feito 
Comando de cabeça

Redirecionamento de entrada no Linux

Podemos redirecionar o conteúdo do arquivo para enquanto loop Usando o operador de redirecionamento de entrada (<).

Enquanto leia Lread do eco $ lread feito < /etc/passwd | head -n 5 
Redirecionamento de entrada

Você também pode armazenar o nome do arquivo em uma variável e passá -lo por um operador de redirecionamento.

Filename = "/etc/passwd" enquanto lia lread do eco $ lread feito < $FILENAME 
Armazenar o nome do armazenamento em variável

Você também pode passar os nomes de arquivos como um argumento para o seu script.

Enquanto leia Lread do eco $ lread feito < $1 | head -n 5 
Armazenar o nome do arquivo como argumento

Separador de campo interno

Você pode trabalhar com diferentes tipos de formatos de arquivo (CSV, TXT, JSON) e você pode dividir o conteúdo do arquivo com base em um delimitador personalizado. Nesse 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 /etc/passwd arquivo que tem um cólon (:) Como delimitador. Agora você pode dividir cada palavra de uma linha e armazená -la em uma variável separada.

No exemplo abaixo, estou dividindo /etc/passwd Arquive com um cólon como meu separador e armazenando cada divisão em diferentes variáveis.

enquanto ifs = ":" Leia a b c d e f g do echo $ a echo $ b echo $ c echo $ d echo $ e echo $ f echo $ g done done doado < /etc/passwd 
Separador de campo interno

Eu 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ê laço através do conteúdo do arquivo. Para demonstrar isso, criei um arquivo de amostra com o conteúdo abaixo. Existem 4 linhas e poucas linhas vazias, liderando espaço em branco, espaço em branco, caracteres de guia na linha 2 e alguns caracteres de fuga (\ n e \ t).

Arquivo com linhas vazias
Enquanto leia Lread do eco $ lread feito < testfile 
Linha em branco não ignorada

Veja o resultado, a linha em branco não é ignorada. Além disso, uma coisa interessante a ser observada é como os espaços brancos são aparados pelo ler comando. Uma maneira simples de ignorar linhas em branco ao ler o conteúdo do arquivo é usar o operador de teste com o -z sinalizador que verifica se o comprimento da string é zero. Agora vamos repetir o mesmo exemplo, mas desta vez com um operador de teste.

Enquanto leia Lread, faça se [[ ! -z $ lread]] então echo $ lread fi feito < testfile 
Linhas em branco ignoradas

Agora, da saída, você pode ver linhas vazias são ignoradas.

Escapar de personagens

Escape personagens como \ n, \ t, \ c não será impresso ao ler um arquivo. Para demonstrar isso, estou usando o mesmo arquivo de amostra que tem poucos caracteres de fuga.

Arquivo com caracteres de fuga
Enquanto leia Lread do eco $ lread feito < testfile 
Escape Character in Linux

Você pode ver nos caracteres de escape de saída perderam seu significado e somente n e t são impressos em vez de \ n e \ t. Você pode usar -r Para evitar a interpretação da barra de barragem.

Enquanto leia -r lread do eco $ lread feito < testfile 
Evite a interpretação da barra de barra

É isso para este artigo. Gostaríamos muito de ouvir de você se houver algum feedback ou dicas. Seu feedback é o que nos ajuda a criar um conteúdo melhor. Continue lendo e continue apoiando.