Lendo registros formatados de arquivo de texto em bash

Publicado por Perfil removido em 29/04/2013

[ Hits: 5.646 ]

 


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


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


Outras dicas deste autor

Como criar um pacote DEB com o debreate

O que fazer após instalar o Ubuntu 18.04 LTS

from xdg.DesktopEntry import DesktopEntry

Alterar nome de interface de rede: eth0 para eth1 e vice versa

Unity Tweak Tool - Personalizando Ubuntu 13.04

Leitura recomendada

su/sudo em modo visual

IP em modo texto (modem router)

Configuração de placas de vídeo nVidia através do module assistant

sudo: lendo a senha automaticamente através de shell script

Base de dados mais organizada em shell script

  

Comentários

Nenhum comentário foi encontrado.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts