De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.

O IFS - Internal Field Separator

Colaboração: Julio Cezar Neves

Data de Publicação: 05 de setembro de 2018

Um lembrete, as inscrições para o curso Programação Shell Linux já estão abertas. Aproveite esta última oportunidade para estudar ainda em 2018 com o Prof. Julio Neves.

Saiba mais e faça sua inscrição


O IFS - Internal Field Separator

O Shell possui uma variável que é muito útil, que é o separador de campos e chama-se $IFS, cujo valor padrão é <ESPAÇO>, <TAB> e <ENTER>, ou seja o Shell sempre usa esses valores como os separadores entre os campos, mas essa variável pode ser alterada de forma a te ajudar na elaboração de scripts.

O comando read

Este comando lê campos separados pelo conteúdo de $IFS. Veja isso:

$ read Nome Sobrenome <<< "Eva Dias"
$ echo $Nome:::$Sobrenome
Eva:::Dias

$ read Nome Sobrenome <<< "Sara Dores da Costa"
$ echo $Nome:::$Sobrenome
Sara:::Dores da Costa

Ou seja, a variável $Nome recebeu o primeiro pedaço e $Sobrenome recebeu o resto. Então vamos gerar (passo a passo para ficar fácil de entender) um arquivo que tenha cada todas as letras do alfabeto e que cada uma de suas linhas tenha 5 letras:

$ echo {A..Z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

$ echo {A..Z} | xargs -n5
A B C D E
F G H I J
K L M N O
P Q R S T
U V W X Y
Z

$ echo {A..Z} | xargs -n5 > letras

Note que o comando xargs sempre tentará trabalhar com o maior número de parâmetros possíveis, mas sua opção -n 5 limita-o a 5 palavras de cada vez.

E agora vamos ler esse arquivo e listá-lo, separando cada letra por um hífen (-):

$ while read L1 L2 L3 L4 L5  # Leio 5 campos de cada vez
> do
>     echo $L1-$L2-$L3-$L4-$L5
> done < letras
A-B-C-D-E
F-G-H-I-J
K-L-M-N-O
P-Q-R-S-T
U-V-W-X-Y
Z----

Alterando temporariamente variáveis do sistema

Como você viu, o script funcionou. Vamos agora mudar a entrada, separando as letras por dois pontos (:):

$ sed -i 's/ /:/g' letras
$ cat letras
A:B:C:D:E
F:G:H:I:J
K:L:M:N:O
P:Q:R:S:T
U:V:W:X:Y
Z

$ while IFS=: read L1 L2 L3 L4 L5
> do
>     echo $L1-$L2-$L3-$L4-$L5
> done < letras
A-B-C-D-E
F-G-H-I-J
K-L-M-N-O
P-Q-R-S-T
U-V-W-X-Y
Z----

A única coisa necessária a fazer tocar, antes da leitura, o valor de $IFS para dois pontos (:). É muito importante que se diga, que feito desta forma, o valos de $IFS permanecerá imutável para o resto do script, e valerá dois pontos somente durante a execução deste read.

Isso acontece com outras variáveis do sistema associadas a comandos.

Suponha que você precisa saber quem está "logado" há mais de um dia. Para tal você deve excluir (com grep -v) todos as saídas do comando who que tenham a data de hoje. O meu problema é que a minha data esta sendo gerada em inglês e o meu who em pt_BR.

$ date
Mon Sep  3 15:21:28 -03 2018

Para conseguir isso basta alterar a variável $LANG somente durante a execução do comando date. Veja:

$ LANG=pt_BR.UTF-8 date
Seg Set  3 15:30:08 -03 2018

Desta forma, a linguagem (indicada pela variável $LANG) foi alterada somente para a execução do comando date.

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Julio Cezar Neves