[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] script para leitura de arquivos
From: |
Gustavo Chaves |
Subject: |
Re: [shell-script] script para leitura de arquivos |
Date: |
09 Mar 2005 08:39:27 -0300 |
User-agent: |
Gnus/5.09 (Gnus v5.9.0) Emacs/21.3 |
>>>>> On Tue, 8 Mar 2005 08:48:57 -0800 (PST), Rodrigo Monteiro
>>>>> <address@hidden> said:
> #cria o arquivo usuarios_total com todos os orgaos do diretorio onde ficam
os arquivos dos usuarios (funciona OK)
> ls -1 /usr/local/jabber-1.4.2/spool/im.ceara.gov.br/ | cut -f1 -d"."
>/usr/local/jabber-1.4.2/usr/rodrigo/usuarios_total.txt
> #tira os orgoas repetidos (funciona OK)
> sort -u /usr/local/jabber-1.4.2/usr/rodrigo/usuarios_total.txt >
/usr/local/jabber-1.4.2/usr/rodrigo/temp_usu.txt
> #daqui pra baixo eh que da erro
> #para ele ir da primeira ate a ultima linha do arquivo temp_usu.txt
> tot=`wc -l /usr/local/jabber-1.4.2/usr/rodrigo/temp_usu.txt`
> echo $tot > /usr/local/jabber-1.4.2/usr/rodrigo/total.txt
> cut -f1 -d" " </usr/local/jabber-1.4.2/usr/rodrigo/total.txt
>/usr/local/jabber-1.4.2/usr/rodrigo/total02.txt
> total=`sed 1q /usr/local/jabber-1.4.2/usr/rodrigo/total02.txt`
> for ((cont=1;total;cont++))
> do
> #colocar na variavel $pal o conteudo da linha numero $cont do arquivo
temp_usu.txt
> pal=`sed -`$cont`q/usr/local/jabber-1.4.2/usr/rodrigo/temp_usu.txt`
> # mostrar "orgao01: 130 usuarios"
> echo "$pal: `ls -1
/usr/local/jabber-1.4.2/spool/im.ceara.gov.br/$pal.*.xml | wc -l` usuarios"
> done
Se consegui entender direito o seu script, eu creio que o seguinte
deveria funcionar:
cd /usr/local/jabber-1.4.2
ls spool/im.ceara.gov.br | cut -f1 -d. | sort -u | while read pal; do
n=`find spool/im.ceara.gov.br -maxdepth 1 -name "$pal.*.xml" | wc
-l`
echo "$pal: $n usuarios"
done
O primeiro 'cd' é só pra diminuir o tamanho das linhas seguintes. Se
você precisa voltar ao diretório original e estiver usando uma shell
que suporte os comandos pushd e popd, troque o cd por um 'pushd
/usr/local/jabber-1.4.2' e, no final, execute um 'popd' pra voltar.
O pipe que precede o while evita os vários arquivos temporários que
você criou.
O while substitui o for, evitando a necessidade de contar as linhas,
evitando as várias chamadas ao sed e simplificando a lógica.
Troquei o ls por um find porque se houverem muitos arquivos xml que
casam com o glob "$pal.*.xml" a shell pode não conseguir expandi-los
todos na linha de comando. Dá pra fazer isso com um ls no diretório e
filtrando com grep, mas fica difícil garantir que a expressão regular
passada pro grep vai ser correta para todos os casos.
BTW, a opção -maxdepth é específica do find do GNU. Se o seu find não
a suportar dá pra simular isso com a opção -prune, mas fica mais
complicado.
Por outro lado, eu não testei o script e pode não funcionar exatamente
como você quer... caveat emptor.
Gustavo.