Lendo registros formatados de arquivo de texto em bash

Publicado por Perfil removido em 29/04/2013

[ Hits: 6.057 ]

 


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

FBReader - Leitor de ebooks para GNU/Linux e Android

Salvando trechos de arquivos PDF com o CUPS-PDF

Cyberlink PowerDVD para Linux

Powertweak-gtk: ajuste seu hardware nos Debian-like

O que fazer após instalar Linux Mint 18

Leitura recomendada

Montando partição Windows automaticamente

Renomeando em massa sem precisar instalar comandos adicionais

Instalador automático do Java JRE Oracle

Ordenando strings em shell script

FATAL: Module ndiswrapper not found - Linux Mint Debian

  

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