Peczenyj's Blog

Just Another /Perl|Ruby|C++|Java|Python|JavaScript|Flash|Bash/ Hacker

Caçadores Da Classe Perdida

Eu já tinha feito algo parecido mas este post do Claudio Miranda reavivou a minha memória.

#!/bin/bash
[[ $2 ]] || { echo "Uso: ${0} diretorio classe" ; exit 1 ; }
find "${1}" -name \*.jar -print | xargs -n 1 unzip -l 2>&- | awk -v class="${2}" '
BEGIN { IGNORECASE=1 }
/^Archive/ { file="\nArquivo:\n\t"$NF": \nClasses:\n\t" }
/class$/ && $NF ~ class { print file,$NF ; file="\t"; total++ }
END { print "\nTotal",total + 0,"classes encontradas!" }'


Informando como parâmetros um diretório de partida e um fragmento do nome da classe, o find localizará todos os arquivos com extensão jar e vai mandar pro nosso amigo xargs. Este envia um a um para o unzip que lista (-l) o conteúdo de cada arquivo. Eu poderia procurar a classe que eu quero com o grep, mas o awk foi a escolha para formatar melhor a saída de dados.

Perceba que a variavel IGNORECASE tem valor diferente de 0, assim eu posso procurar por um trecho do tipo xml ou XML. Eu preciso saber o nome do arquivo ‘corrente’ e isso é informado pela linha que começa com ‘Archive’. Quando eu encontro uma linha que termina com ‘class’ e o ultimo campo ( $NF ) ‘casa’ com o fragmento de nome (alias pode ser uma expressão regular!) eu imprimo esta linha.

Eu fiz uma sacanagem pra saída de dados ficar ‘bonitinha’, que é imprimir o ‘cabeçalho’ apenas uma vez, depois eu troco por tab (\t) – e no final eu mostro um sumário com o número de referências encontradas.

Este script pode ser modificado para outros propósitos. Note que eu procuro tanto no nome da classe quando no nome dos pacotes (diretórios), assim xml poderia casar com XMLHelper.class ou /java/xml/foobar.jar – mas basta ser criativo para resolver isso!

Comments

Tiago Peczenyj
AWK é extremamente versátil!
Claudio Miranda
Olá Tiago, obrigado pela dica-dica e manter a formatação de saída. Vou aprender um pouco mais de AWK.

Powders Graduation

Os programas de tradução estão cada vez melhores.

Pós Graduação = Powders Graduation

Graduação em Pó? Pulverizada?

São 22 resultados no google até o momento!

Usando O Curl Com Endereços IPv6

Hoje em dia usar endereçamento IPv6 parece um pouco exótico, porém aos poucos ele começa a aparecer em algumas redes internas e logo será a unica saída quando todos os 32 bits do IPv4 estiverem em uso, previsto para 2012.

Diga adeus ao “206.45.32.234” - longa vida ao “2001:bce4:5641:3412:341:45ae:fe32:65”. Perceba como agora utilizamos a representação hexadecimal e cada quarteto é separado por um ‘:’ – o que torna mais fácil a sua memorização (e viva o DNS). Um bom artigo introdutório pode ser lido aqui.

Pois bem, imagine agora que precisamos acessar uma pagina em um servidor (por enquanto interno) através de um endereço IPv6. A url ficaria assim, por exemplo:

http://[2001:bce4:5641:3412:341:45ae:fe32:65]:8000/index.php


Como o caracter ‘:’ é usado em uma url para separar o servidor da porta (é claro que isso é omitido na maioria dos casos, quando usamos a porta 80), e tiveram que proteger o ip entre [colchetes]. Um browser como o Firefox consegue entender esta url facilmente, entretanto não tive a mesma sorte ao usar os browsers modo texto mais comuns - lynx e o curl.

Não subestime a importância destes browsers! Muitas vezes nos encontramos em um sistema com poucos recursos ou precisamos efetuar certas ações via algum script e eles caem como uma luva – principalmente o curl, que simplesmente transfere informações de/para um servidor web, fazendo GET, POST, HEAD, upload de arquivos, etc.

No man do curl descobri que o mesmo depende da libcurl ser capaz de resolver endereços ipv6 - inclusive posso forçar a usar apenas ipv6 com a opção -6.

Entretanto o curl tem outra interpretação dos colchetes em uma url – elas são um recurso de sequência para multiplos downloads (da mesma forma como o bash faz, porém é interno ao curl), como nesse exemplo:

curl 'http://www.any.org/archive[1996-1999]/volume[1-4]part{a,b,c,index}.html'


Para desabilitar este “URL globbing parser” basta usar a opção -g, o que nos leva a solução completa:

curl -6g 'http://[2001:bce4:5641:3412:341:45ae:fe32:65]:8000/index.php'


Caso não queria desabilitar o globbing, basta ‘escapar’ os colchetes usando a contra-barra antes. O curl é um programa extremamente versátil, um verdadeiro canivete suíço na linha de comando, vale a pena estuda-lo em algum tempinho livre.

Barbosa

Trinta e oito anos depois da Copa do Mundo de 1950, um homem volta no tempo a fim de impedir o gol que derrotou o Brasil, destruiu seus sonhos de infância e acabou com a carreira do goleiro Barbosa.

Premiadíssimo curta de Jorge Furtado e Ana Luiza Azevedo, de 1988, unindo ficção científica e futebol de uma forma incrivelmente brasileira. Com Antônio Fagundes e Zé Vitor Castiel.

Para saber mais: CASACINEPOA

Assista aqui. Vale a pena!