Ler diretorio de arquivo texto e calcular consumo total [RESOLVIDO]

1. Ler diretorio de arquivo texto e calcular consumo total [RESOLVIDO]

L. GUSTAVO
lgfcosta

(usa Linux Mint)

Enviado em 17/10/2012 - 11:41h

Olá pesssoal,

Tenho um arquivo com o conteúdo a seguir:

<inicio>
connected to target database: PCNISCI (DBID=4099166379)

connected to recovery catalog database


List of Archived Log Copies
Key Thrd Seq S Low Time Name
------- ---- ------- - --------- ----
3500237 1 1731 A 15-OCT-12 /arch1/instance/ARCH1_1731_723348591.log
3500238 1 1731 A 15-OCT-12 /data10/flash/instance/instance/archivelog/2012_10_16/o1_mf_1_1731_87t02rpq_.arc
3501785 1 1732 A 16-OCT-12 /arch1/instance/ARCH1_1732_723348591.log
3501786 1 1732 A 16-OCT-12 /data10/flash/instance/instance/archivelog/2012_10_16/o1_mf_1_1732_87w5d9qd_.arc
3502079 1 1733 A 16-OCT-12 /arch1/instance/ARCH1_1733_723348591.log
3502080 1 1733 A 16-OCT-12 /data10/flash/instance/instance/archivelog/2012_10_17/o1_mf_1_1733_87w8o593_.arc
3502086 1 1734 A 17-OCT-12 /arch1/instance/ARCH1_1734_723348591.log
3502087 1 1734 A 17-OCT-12 /data10/flash/instance/instance/archivelog/2012_10_17/o1_mf_1_1734_87w8oc9l_.arc
3502414 1 1735 A 17-OCT-12 /arch1/instance/ARCH1_1735_723348591.log
3502415 1 1735 A 17-OCT-12 /data10/flash/instance/instance/archivelog/2012_10_17/o1_mf_1_1735_87wd15bn_.arc
3502421 1 1736 A 17-OCT-12 /arch1/instance/ARCH1_1736_723348591.log
3502422 1 1736 A 17-OCT-12 /data10/flash/instance/instance/archivelog/2012_10_17/o1_mf_1_1736_87wd1bb3_.arc

Recovery Manager complete.

<fim>

Eu preciso realizar 2 passos:

1) Da listagem acima, filtrar os diretórios, então, a saída esperada deveria ser as 3 strings:
/arch1/instance
/data10/flash/instance/INSTANCE/archivelog/2012_10_16
/data10/flash/instance/INSTANCE/archivelog/2012_10_17

* Repare que eu poderia ter N diretórios na listagem.

2) Para esses diretórios, contabilizar o consumo em disco deles. Pensei em utlizar o comando "du -s $dir", mas ele me daria o total?

Agradeço antecipadamente a ajuda.


  


2. MELHOR RESPOSTA

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 18/10/2012 - 00:58h

O comando du com o parâmetro -s apresenta apenas o total do diretório.


Segue o script completo:


cat arquivo.list | egrep '^[0-9].*\/.*' | egrep -o '/.*' | while read LINHA; do echo ${LINHA%\/*}; done | sort | uniq | xargs du -sh



Precisando de esclarecimentos adicionais, estamos ai.

Abraços

3. Re: Ler diretorio de arquivo texto e calcular consumo total [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/10/2012 - 16:40h

As ferramentas sobre as quais você deve estudar para poder construir o que precisa são grep, cut, awk (agrega funcionalidades úteis das duas anteriores), sort e uniq.


4. Re: Ler diretorio de arquivo texto e calcular consumo total [RESOLVIDO]

L. GUSTAVO
lgfcosta

(usa Linux Mint)

Enviado em 18/10/2012 - 09:47h

Olá rai3mb,

Amigo, você já solucionou o problema, muito bom.

Poderia te alugar mais? poderia me explicar as expressões regulares que vc usou? E se no lugar no "espaço" for uma tabulação, tb funciona? vou testar isso aqui.

Muito obrigado, meu caro.


5. Re: Ler diretorio de arquivo texto e calcular consumo total [RESOLVIDO]

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 18/10/2012 - 09:52h

Se no lugar do espaço for tabulação, não tem problema, pois nem estou checando isso, estou procurando o inicio a partir da barra (/)


egrep '^[0-9].*\/.*' | egrep -o '/.*' | while read LINHA; do echo ${LINHA%\/*}



Na expressão procuro as linhas do arquivo que inicial com números e que tenham uma barra (/), depois pego apenas o conteúdo a partir da barra, e em ${LINHA%\/*}, pego apenas o conteúdo até antes da última barra, ou seja, só o diretório, sem o nome do arquivo.

Espero ter ajudado, vou pro trabalho ;-), só volto à quase meia noite :-(


6. Re: Ler diretorio de arquivo texto e calcular consumo total [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 18/10/2012 - 10:08h

Rai3mb,

Normalmente eu prefiro a abordagem de ensinar a pescar, em vez de dar o peixe. (Enquanto estava escrevendo a mensagem, vi que o usuário respondeu, pedindo explicações sobre as expressões regulares. Menos mal -- aliás, é muito bom ver gente querendo aprender, em lugar de tentar conseguir mão-de-obra gratuita.)

Você assumiu que ele está usando o grep da GNU (o grep tradicional não tem a opção "-o"). Será o caso se ele estiver usando Linux, mas há pelo menos dois outros tópicos mais ou menos correntes no fórum de shell script em que se está falando de Solaris. Com saber se não é o caso dele, também? (Ele já respondeu que funcionou, logo não é o caso. Mesmo assim, eu gosto sempre de ser o mais generalista possível, pois eu trabalho com vários sabores de UNIX e várias distribuições diferentes de Linux, e é muito comum ter ferramentas ligeiramente incompatíveis, de modo que é interessante ficar só com o que é comum a todos.)

Eu não gosto de construções como "algum_comando | while read x; do ... done", porque o pipe, ao contrário do que possa parecer, não afeta apenas o "read x", mas todo o corpo do que vai dentro do bloco "do ... done". Não é significativo neste caso, em que você só faz echo (não lê nada), mas se você rodasse qualquer comando que pudesse ler alguma coisa da entrada padrão, ele consumiria a saída de algum_comando, competindo com o read x. Mais seguro, nesse caso, seria fazer algo como o seguinte (funciona no bash).

# O "3", abaixo, é o número de um file descriptor que não está em uso.
exec 3< <(algum_comando)

# Na linha abaixo, note que o redirecionamento afeta apenas o read
while read x <&3; do
...
done

# Fecha o descritor 3.
exec 3<&-


Em outros shells, como ksh, ash, dash ou o bom e velho sh, essa construção pode não funcionar (mesmo algumas versões do ksh que aceitam o "<(...)" para um comando geral não o reconhecem numa linha de exec só para redirecionar descritores). Nesses casos, sua melhor alternativa é usar um fifo ou arquivo temporário (funciona também no bash).

fifoname="/tmp/myscript.$$"
if mkfifo "$fifoname"; then
algum_comando > "$fifoname" &
exec 3< "$fifoname"
rm "$fifoname"
while read x <&3; do
...
done
exec 3<&-
wait # Para liberar o pid de "algum_comando"
fi


Por fim, sendo pentelhamente purista, sua solução pode capotar no caso de algum componente do pathname ter espaços. Duvido que seja o caso do autor original do tópico, mas dá para fazer de modo um pouco mais genérico.


7. Re: Ler diretorio de arquivo texto e calcular consumo total [RESOLVIDO]

L. GUSTAVO
lgfcosta

(usa Linux Mint)

Enviado em 18/10/2012 - 10:27h

Olá Paulo,

Boa explicação. Na verdade eu teria que testar em vários servidores onde que além de Linux, tem AIX, etc.

Olhando sua mensagem, fui logo testar no Aix e vc está certo. Vc conhece alguma equivalência?

Obrigado.


8. Re: Ler diretorio de arquivo texto e calcular consumo total [RESOLVIDO]

L. GUSTAVO
lgfcosta

(usa Linux Mint)

Enviado em 18/10/2012 - 10:52h

Olá amigos,

Sobre a solução do nosso amigo Rai3mb, estou pensando outra coisa: não tenho garantia se o campo "Low Time" vai estar formatado com "-" ou "/". Aí complica...

Esses detalhes que pegam.


9. Re: Ler diretorio de arquivo texto e calcular consumo total [RESOLVIDO]

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 18/10/2012 - 11:53h

lgfcosta escreveu:

Olá amigos,

Sobre a solução do nosso amigo Rai3mb, estou pensando outra coisa: não tenho garantia se o campo "Low Time" vai estar formatado com "-" ou "/". Aí complica...

Esses detalhes que pegam.


Bom os diretórios sempre vão começar com a barra, não é mesmo?

Sobre o problema de parâmetros e comandos entre versões de UNix, dê uma checada se vai precisar validar isso mesmo, e faça as adaptações consultando o manual do comando nos Unix disponíveis a você.

Eu só tenho GNU/Linux ;-)


10. Re: Ler diretorio de arquivo texto e calcular consumo total [RESOLVIDO]

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 18/10/2012 - 11:55h

Paulo1205, ok, concordo com você, mas só tenho o Unix GNU/Linux, infelizmente ( ou felizmente) não tenho contato com outros sabores.

Viva ao GNU/Bash ;-)


11. Re: Ler diretorio de arquivo texto e calcular consumo total [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 18/10/2012 - 13:49h

lgfcosta escreveu:

Olá Paulo,

Boa explicação. Na verdade eu teria que testar em vários servidores onde que além de Linux, tem AIX, etc.

Olhando sua mensagem, fui logo testar no Aix e vc está certo. Vc conhece alguma equivalência?


Tradicionalmente, você teria de usar sed, awk ou expr. Por exemplo, grep -o expr seria mais ou menos equivalente a grep expr | sed 's/^.*\(expr\).*/\1/'.




12. Re: Ler diretorio de arquivo texto e calcular consumo total [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/10/2012 - 17:13h

Ou, para usar um programa só, a sed -e '/expr/!d' -e 's/^.*\(expr\).*$/\1/'.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts