Lendo registros formatados de arquivo de texto em bash

Publicado por Perfil removido em 29/04/2013

[ Hits: 5.818 ]

 


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

Instalando Navegador Chromium no Debian 12

Assistindo DVD no SuSE 10.1

Instalando o aMSN 0.93 com traydoc no KDE 3.1

Servidor DNS do google no linux

Instalando Skype para Linux Beta no Linux Mint 18

Leitura recomendada

LTSP + Sound Blaster + Som

Linux Omni-bot Autosetup 2011, programinha que facilita o uso do Omni-bot

Enviando textos para internet com o terminal (like pastebin)

Sed para formatar endereços MAC

Mplayer 1.0pre6a (script de instalação)

  

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