shell-script-pt
[Top][All Lists]
Advanced

[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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]