Pular para o conteúdo

Lendo registros formatados de arquivo de texto em bash

Dica publicada em Shell Script / Miscelânea
Perfil removido removido
Hits: 6.258 Categoria: Shell Script Subcategoria: Miscelânea
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Lendo registros formatados de arquivo de texto em bash

É possível ler informações de um arquivo através do bash de um modo muito semelhante ao que o comando cut e a linguagem AWK proporcionam.

De modo que, pode-se pensar todo o problema em bash, evitando alguma complicação na mistura das duas linguagens.

Veja o fragmento do arquivo /etc/group:

root:x:0:
daemon:x:1:
bin:x:2:
tty:x:5:
disk:x:6:
uucp:x:10:
man:x:12:
proxy:x:13:


Ele possui o caractere ":" como separador de campos e possui quatro campos em cada registro (linha).

Usa-se o comando read coma opção "-a" em um laço while para a leitura. Além disso, deve-se mudar o default de separação de campos nesse tipo de leitura. A variável que determina isso, é a variável IFS (Internal Field Separator).

Dependendo da situação, pode ser bom guardar o valor da IFS para restaurá-lo posteriormente, de modo a não ter nenhuma surpresa.

Para a entrada dos dados do arquivo /etc/group, há dois modos: um no início e outro no fim:
  • 1º ao INÍCIO: cat /etc/group | while read -a i; do ...
  • 2º ao FIM: ... done < /etc/group;

A desvantagem do primeiro, é o fato de que o "pipe" executa o "while" em uma subshell e qualquer variável usada antes e fora desse "pipe", deve ter sido previamente exportada (comando export).

A opção "-a" aplica um split (quebra, separação, fragmentação) da linha lida naquela etapa do laço, de modo que a variável "i" é, na verdade, um array. O primeiro item desse array é ${i[0]}. Depois segue ${i[1]}, ${i[2]} ... Os campos são definidos pela variável IFS.

Concluindo com estes fragmentos de códigos:

1.

OLD_IFS=$IFS
IFS=:

while read -a i; do

      echo -e "group:\t${i[0]}";
      echo -e "passwd:\t${i[1]}";
      echo -e "gid:\t${i[2]}";
      echo -e "users:\t${i[3]}";

done < /etc/group

IFS=$OLD_IFS
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.


2.

OLD_IFS=$IFS
IFS=:

cat /etc/group | while read -a i; do

      echo -e "group:\t${i[0]}";
      echo -e "passwd:\t${i[1]}";
      echo -e "gid:\t${i[2]}";
      echo -e "users:\t${i[3]}";

done < /etc/group

IFS=$OLD_IFS


O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Instalar TeamSpeak-Client no ArchLinux

Lendo sistemas de arquivo Linux no Windows

Configuração de teclado utilizando as distribuições CentOS, Debian e Ubuntu

O que fazer após instalar Linux Mint 18

Alsactl store: home directory /home/seu_login not ours

Colocando bordas em imagens em lote através de shell script

Como mudar o teclado do Debian em uma máquina virtual configurada em outro SO

online_man - Páginas de manual online no terminal

Base de dados mais organizada em shell script

Backup para fita DDS4

Nenhum comentário foi encontrado.

Contribuir com comentário

Entre na sua conta para comentar.