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.257 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.

Gentoo - Instalação com o Anaconda

Instalando e configurando o Thunderbird

Gerando relatórios do Squid diariamente

Vídeo aula: Como colocar wallpaper comum a todos os usuários

Instalando USB Stick Formater no Ubuntu 16.04

MyIP - Facilitador para obter endereço IP externo

Instalador automático do Java JRE Oracle

Atualização dos Menus do Wine

Alternar o mouse/touchpad entre destro e canhoto no Openbox

cURL - Brute-force em aplicações Web

Nenhum comentário foi encontrado.

Contribuir com comentário

Entre na sua conta para comentar.