Expansões do Shell

By | December 8, 2012

Todo sysadmin *nix que se preze tem que conhecer shell scripting pelo menos razoavelmente. Conhecer bem com certeza vai fazer sua vida mais fácil (ou mais difícil, já que as tarefas complexas vão ser redirecionadas para você). Agora, masterizar é coisa para poucos. Sou metido a besta, mas acompanhando a lista shell script brasileira eu vira-e-mexe fico maravilhado com as coisas que o povo consegue fazer. Quando crescer quero ser igual ao Júlio C. Neves. 🙂

Uma feature que vale a pena ser aprendida em shell-scripting é a capacidade de expansão do shell, principalmente o Bash, que é o shell standard em qualquer distribuição Linux e vários Unixes por ai.

Veja o seguinte caso:

Vira e mexe eu preciso fazer manutenção e alterar coisas em múltiplos clientes. Normalmente em um arquivo ou outro enterrado no fundo de uma pilha de sub-diretórios. Algo como:

$ cat /data/cliente1/conf/integration/system7/peer.conf
peer=192.168.1.1

E ai são 150 clientes que precisam desse arquivo atualizado. Nada que um loop for não resolva, certo?

$ cd /data; for cliente in cliente*; do sed -i "s/192.168.1.1/10.10.10.1/g" $cliente/conf/integration/system7/peer.conf; done

Ora, mas que tal isso?

$ sed -i "s/192.168.1.1/10.10.10.1/g" data/cliente*/conf/integration/system7/peer.conf

Qual a diferença?

 $ time for cliente in cliente*; do sed -i "s/10.10.10.1/192.168.1.1/g" $cliente/conf/integration/system7/peer.conf; done

real    0m0.518s
user    0m0.040s
sys     0m0.060s
$ time sed -i "s/192.168.1.1/10.10.10.1/g" data/cliente*/conf/integration/system7/peer.conf

real    0m0.028s
user    0m0.008s
sys     0m0.020s

Além de muito mais elegante é muito mais rápido.

Outros truques interessantes:

$ mkdir -p data/cliente{1..150}/conf/integration/system7/
$ find data/|wc -l
601

Um comando, 601 diretórios e sub-diretórios criados.

E você pode especificar mais detalhadamente:

$ zcat apport.log.{1,3,6}.gz

Que tal renomear um arquivo?

$ mv batata.{conf,cnf}

Da próxima vez que precisar de um shell-script tente encaixar algumas expansões lá. Depois de um tempo fica natural. 😉

No tag for this post.

3 thoughts on “Expansões do Shell

  1. Pascal

    Essa de renomear a batata vou tatuar no braço para nunca esquecer! MUITO prático quando o arquivo a ser renomeado está em uma pasta com nomes de arquivos com prefixo semelhante.

Comments are closed.