Archive for the ‘shell script’ Category

RedHat 7 (e similares) e novos conceitos/comandos – parte 2

Como relatei na parte 1, houve algumas modificações nesta versão 7 do RedHat (e seus similares). Uma das modificações foi o sistema de inicialização. O, até então predominante, sysVinit foi substituído pelo systemd.

Uma documentação completa sobre o systemd por ser encontrada aqui [1]. Recomendo também a leitura desta documentação [2] elaborada pela comunidade do Arch Linux.

Continue lendo

Versão 4 do awk e novas palavras reservadas

Nos primeiros dias de novembro foi lançada uma nova versão do Slackware e alguns dias depois me surgiu a necessidade de instalar um novo servidor firewall. Se fosse outra distro, eu esperaria a estabilização da versão para então instalar. Mas tratando-se do Slackware, tive confiança que poderia colocar em produção uma versão “saída do forno”.

Tenho um roteiro de instalação e algumas rotinas que utilizo de forma padronizada em todos os servidores administrados por mim. Dentre estas rotinas, uma que coleta dados de carga de CPU e memória para o MRTG. Venho utilizando estas rotinas a bastante tempo, baseadas neste artigo do Augusto Campos.

Pois bem, a rotina que coleta dados da CPU funcionava bem até que o Slackware passou a utilizar a versão 4 do awk. A partir desta versão, a palavra “load” (utilizada no script) passou a ser uma palavra reservada para o comando awk. Com isto, a geração de dados sobre CPU e memória deixou de ser gerada!

Como gastei um tempo até que descobrisse o motivo (o “load” como palavra reservada), achei melhor compartilhar com os meus leitores e deixar registrado aqui para referências futuras.

[link] Evite armadilhas em shell

Depois que aprendi o poder do shell tornei-me um fã desta linguagem de programação.

Por isto sempre que encontro um material interessante, guardo nos meus alfarrabos! Assim, segue mais uma página que deve ser arquivada:

[CC] If em 1 linha (shell script)

Embora comandos de 1 linha nem sempre germ clareza (e por isto os evito), hoje, especificamente, resolvi empregar um “if” em uma linha para um caso em especial.

Como não tenho o costume de usá-los, não lembrava a sintaxe. Nada que o “pai Google” não resolva.

Li este termo semana passada em algum blog e achei bastante original!

Talvez este não seja o link mais específico para meu caso, mas foi o primeiro que encontrei e solucinou-me o problema. Além disto, o blog deste link tem material bastante interessante (e bons autores), que já utilizei em outros casos. Só por isto já vale a referência!

Mas esta seção é para ser simples, então chega de lero-lero e vamos ao comando (aproveitando o exemplo do link citado!):

[ $var -ne 1 ] && echo "Não é 1"

ou ainda:

test -w $file || echo "$file não é gravável"

 

Shell + MySQL + GNUPlot = gráficos legais

Fazem 11 meses e 1 dia que escrevi o post sobre como gerar gráficos em shell acessando um banco de dados Oracle.

Repare na coincidência do dia e mês dos 2 posts!

Então para último Dia da Liberdade de Software que participei, resolvi montar uma palestra relâmpago sobre este assunto. A ideia era mostrar que era possível gerar gráficos com dados armazenados em um banco de dados a partir do shell.

Como se tratava de um evento sobre liberdade de software, eu não poderia utilizar um banco de dados proprietário! :p Então reescrevi minha função para acessar os dados armazenados em um MySQL.

Vejam as voltas que o mundo dá… Enquanto escrevo este post a Oracle é quase dona do MySQL (falta a união européia decidir)!

Aqui é possível encontrar a versão do programa em shell acessando o MySQL. Também deixo disponível a palestra, caso tenham interesse.

Para o MySQL precisei criar uma função para extração dos dados e geração do arquivo de trabalho (em Oracle, essa execução estava dentro do próprio programa shell). A função criada no MySQL está comentada dentro do próprio .sh.

Temporada de apresentações

Para quem não sabe, sou integrante do Grupo de Usuários de Software Livre do Vale do Rio dos Sinos (SLVS). Fomos convidados a participar da I Semana da Informática da IENH.Minha participação foi com uma oficina de Shell Script. Apesar do tempo reduzido (1:30), tentei passar os principais conceitos que permitem ao usuário a criação de scripts em Shell.

Espero que tenha conseguido converter mais alguns usuários para o mundo *nix!

A apresentação que utilizei durante a oficina, deixei disponível na página de apresentações do grupo.

Ainda preciso adicionar lá na página a apresentação sobre LaTeX que fiz no último FLISOL que promovemos aqui em Novo Hamburgo. Farei nos próximos dias.

Variáveis em subshells

Recentemente enfrentei alguma dificuldade com a contabilização de contadores em shell script durante o processamento de arquivos texto. Para fins didáticos, ilustrarei com um exemplo simples. Imaginem que gostaríamos de saber quantos usuários têm como grupo principal o users. Poderíamos resolver o problema como no exemplo a seguir:

GRUPO=100   # users
CONTADOR=0
cat /etc/passwd | while read VALORES
do
   # verifica se grupo do usuario eh o grupo que deve ser contabilizado
   if [ `echo ${VALORES} | cut -d":" -f4` == ${GRUPO} ]
   then
      let CONTADOR++
   fi
done
echo ${CONTADOR}

Sei que existem maneiras mais simples de resolver o problema, mas lembro que é um exemplo didático, com o objetivo de ilustrar a dificuldade que encontrei.

Bom este era o meu raciocínio antes de dar-me conta da questão do subshell criado pelo pipe (|) que adicionei na minha lógica (vejam detalhes sobre o escopo de variáveis em subshells). Quando se faz uso de subshells em progração de shell script, todas as variáveis criadas neste contexto somente são válidas entre o “do” e o “done” (para o caso do exemplo citado).

E qual a solução para o problema então? Bom, como em toda programação, podem existir várias! A primeira tentativa seria contornar o uso de subshells. Para o exemplo citado, seria bastante simples:

GRUPO=100   # users
echo "Número de usuários no grupo ${GRUPO}: `cat /etc/passwd | cut -d":" -f4` | grep ${GRUPO} | wc -l`"

Mas nem sempre a solução pode descartar o uso de subshells. O que fazer então? Uma outra alternativa seria o uso de um arquivo temporário como acumulador:

GRUPO=100   # users
TMP="/tmp/contador.tmp"
echo 0 > ${TMP}
cat /etc/passwd | while read VALORES
do
   # verifica se grupo do usuario eh o grupo que deve ser contabilizado
   if [ `echo ${VALORES} | cut -d":" -f4` == ${GRUPO} ]
   then
      CONTADOR=`cat ${TMP}`
      let CONTADOR++
      echo ${CONTADOR} > ${TMP}
   fi
done
echo `cat ${TMP}`
rm ${TMP}

Pode não ser uma solução tão elegante, mas é funcional! Se desejarem adicionar mais sugestões, por favor, colaborem.

Latex e bibliografia em português

Atualização em 11/10/2019 (já devia ter atualizado antes – vejam data do comentário!):

Conforme a dica do leitor Leandro Zatesko, eu teria resolvido facilmente com a seguinte instrução:

\selectbiblanguage{brazil}

 

Texto original:

Em fase final de escrita de minha dissertação, estava verificando as correções apontadas pelos avaliadores de minha banca de andamento e deparei-me com o apontamento do and no nomes dos autores da minha bibliografia.

Em BibTex, ao criar uma citação, o campo do autor tem a seguinte formatação:

author = {Fulano, Chiquinho AND Beltrano, Zezinho}

Ao gerar o documento através do LaTex, a saída para a citação fica parecida com a seguinte (depende do estilo de bibliografia escolhida):

[Fulano and Beltrano, 2009] Fulano, Chiquinho and Beltrano, Zezinho ...

Continue lendo

Shell + Oracle + GNUPlot = gráficos legais

Recentemente estava pensando na possibilidade de visualizar de forma gráfica algumas informações de meu controle financeiro. Os dados já estavam todos lá no meu banco de dados. Bastava extraí-los de forma gráfica. Precisava de uma ferramenta para isto. Queria algo livre. Como resolver?

Bom, já havia mexido com o Jasper + iReport àlgum tempo atrás. Mas fiz pouca coisa. Vamos ver se resolvo de forma rápida. Abri, tentei, perdi a paciência e desisti!

Em função do meu mestrado em andamento, tenho usado muito o Gnuplot (vejam as páginas de exemplo para terem uma idéia do potencial da ferramenta) e tenho criado alguns gráficos bem interessantes. Além disso, sou fã de carteirinha de shell script. Os dados que precisava extrair eram facilmente resolvidos com um select ridículo. Opa, espera lá, eu posso unir as ferramentas e fazer isto! Algumas horas depois estava pronto meu script gerando o gráfico que eu queria.

Gostei da solução e resolvi compartilhar aqui. Para fins didáticos, modifiquei os dados que seleciono, permitindo o uso do schema do scott (uma base de demonstração/aprendizado disponível em bancos Oracle).

Usei o exemplo com Oracle pois meus dados estão neste banco, que uso no meu dia-a-dia. Mas pode ser facilmente adaptado para outros banco de dados (MySQL ou PostgreSQL, por exemplo).

Este é o gráfico gerado pelo script. E aqui está o código do script (se preferir, baixe diretamente):

Continue lendo