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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Arquivo com espaço e posição diferente


From: Jeferson Santos
Subject: Re: [shell-script] Arquivo com espaço e posição diferente
Date: Tue, 19 May 2009 16:44:32 -0300

fiz uma modificação estética no seu script, trocando `blablabla` por
$(blablabla). Também removi o cat /var/log/maillog|grep ANEXO por
fgrep ANEXO /var/log/maillog e movi para o final do loop.  Essas
modificações além de estéticas impactam no desempenho do script (faz um
teste usando o comando time pra ver a diferença).



Abraços,
Jeferson dos Santos



#!/bin/sh
while read line ;
do
nomes=($(echo $line))
##########################################################
count_from=0
while [ $count_from != ${#nomes[@]} ]
do
if [ ${nomes[$count_from]} == from ]
then
let "count_from = count_from + 1"
from=$(echo ${nomes[$count_from]})
fi
let "count_from = count_from + 1"
done
###########################################################
count_to=0
while [ $count_to != ${#nomes[@]} ]
do
if [ ${nomes[$count_to]} == to ]
then
let "count_to = count_to + 1"
to=$(echo ${nomes[$count_to]})
fi
let "count_to = count_to + 1"
done
###########################################################
count_f=0
while [ $count_f != ${#nomes[@]} ]
do
if [ ${nomes[count_f]} == name ]
then
file=$(echo $line |grep -o "name \".*\"" |sed 's/name//')
else
if [ ${nomes[count_f]} == filename ]
then
file=$(echo $line |grep -o "filename \".*\"" |sed 's/filename//')
fi
fi
let "count_f = count_f + 1"
done < <(fgrep ANEXO /var/log/maillog |sed 's/:/ /g'|sed 's/=/ /g' |sed
's/??/ /g')
###########################################################

data=$(echo $line |awk '{print $1, $2, $3":"$4}')
echo $data FROM: $from TO: $to FILENAME: $file > report
done


2009/5/19 Valtoir Jardim <address@hidden>

>
>
> Olá Luciano,
>
> não testei teu script mas parece-me que as linhas a seguir são redundantes:
>
> [1]*
> if [ ${nomes[count_f]} == name ]
> then
> file=`echo $line |grep -o "name \".*\"" |sed 's/name//'`
> else
> if [ ${nomes[count_f]} == filename ]
> then
> file=`echo $line |grep -o "filename \".*\"" |sed 's/filename//'`
> fi
> *
>
> Como escreveste no e-mail anterior a esse que enviaste, o argumento
> anterior
> ao nome do arquivo pode ser tanto "name" quanto "filename", mas acontece
> que
> a opção
>
> [2]*
> file=`echo $line |grep -o "name \".*\"" |sed 's/name//'`
> *
> vai casar com as duas situações, uma vez que a string "filename" contém a
> string "name".
>
> Dá uma conferida aí. Acho que toda a sequência que citei em [1] pode ser
> substituída pela linha em [2]
>
> T+
>
> Valtoir
>
> 2009/5/19 Luciano Estevam Rangel <address@hidden<lrangel%40scopus.com.br>>
>
>
>
> >
> >
> > Pessoal muito obrigado pela ajuda e segue o script para analise de
> > melhorias ou mesmo como referencia para alguma coisa....
> >
> > Não trouxe a entrada do arquivo maillog e a saida do meu script mais
> > prometo passar isso amanha no e-mail....
> >
> > Obrigado mais uma vez a todos
> >
> > #!/bin/sh
> > cat /var/log/maillog|grep ANEXO |sed 's/:/ /g'|sed 's/=/ /g' |sed 's/??/
> > /g' |while read line
> > do
> > nomes=(`echo $line`)
> > ##########################################################
> > count_from=0
> > while [ $count_from != ${#nomes[@]} ]
> > do
> > if [ ${nomes[$count_from]} == from ]
> > then
> > let "count_from = count_from + 1"
> > from=`echo ${nomes[$count_from]}`
> > fi
> > let "count_from = count_from + 1"
> > done
> > ###########################################################
> > count_to=0
> > while [ $count_to != ${#nomes[@]} ]
> > do
> > if [ ${nomes[$count_to]} == to ]
> > then
> > let "count_to = count_to + 1"
> > to=`echo ${nomes[$count_to]}`
> > fi
> > let "count_to = count_to + 1"
> > done
> > ###########################################################
> > count_f=0
> > while [ $count_f != ${#nomes[@]} ]
> > do
> > if [ ${nomes[count_f]} == name ]
> > then
> > file=`echo $line |grep -o "name \".*\"" |sed 's/name//'`
> > else
> > if [ ${nomes[count_f]} == filename ]
> > then
> > file=`echo $line |grep -o "filename \".*\"" |sed 's/filename//'`
> > fi
> > fi
> > let "count_f = count_f + 1"
> > done
> > ###########################################################
> >
> > data=`echo $line |awk '{print $1, $2, $3":"$4}'`
> > echo $data FROM: $from TO: $to FILENAME: $file > report
> > done
> >
> > Luciano Rangel
> >
> >
> > E assim?
> >
> > valtoir@kraftwerk:~$ grep -o "name=\".*\"" t.txt | sed 's/name=//'
> > "TESTE DE ARQUIVO.txt"
> > "teste.txt"
> >
> > Valtoir
> >
> > 2009/5/18 Luciano Estevam Rangel <address@hidden<lrangel%40scopus.com.br>
> <lrangel%40scopus.com.br><mailto:
> > lrangel%40scopus.com.br <lrangel%2540scopus.com.br>> >
> >
> > >
> > >
> > >
> > >
> > > Pessoal eu tinha tentado essa alternativa também porem existe outros
> > tipos
> > > de informação com " no arquivo...Falaha minha de não especifuicar o
> > arquivo
> > > de entrada completo...sem falar que o argumento anterior tambem varia
> de
> > > name e filename
> > >
> > > Exemplo:
> > >
> > >
> > > May 09 13:23 DENY user teste filename="TESTE DE ARQUIVO.txt"
> > > May 09 13:45 ACCEPT user teste cod 1234 filename="teste.txt"
> > > May 09 13:50 ACCEPT "teste.rs" user 1234 cod 1234 name="teste.txt"
> > >
> > > May 09 13:55 DENY user "test.com" cof "345" cod 1222
> filename="rede.pps"
> > >
> > > Obrigado ja pela ajuda de todos
> > >
> > > complementando:
> > >
> > > grep -o "user [a-z]* " t.txt | sed 's/user //'
> > >
> > > 2009/5/18 Valtoir Jardim <address@hidden<valtoirjardim%40gmail.com>
> <valtoirjardim%40gmail.com><mailto:
> > valtoirjardim%40gmail.com <valtoirjardim%2540gmail.com>> <valtoirjardim%
>
> > 40gmail.com><mailto:
> > > valtoirjardim%40gmail.com <valtoirjardim%2540gmail.com>> >
> > >
> > > > Algumas idéias:
> > > >
> > > > valtoir@kraftwerk:~$ grep -o "user [a-z]* " t.txt
> > > > user teste
> > > > user teste
> > > >
> > > >
> > > > valtoir@kraftwerk:~$ grep -o \".*\" arquivo_x.txt
> > > > "TESTE DE ARQUIVO.txt"
> > > > "teste.txt"
> > > >
> > > > T+
> > > >
> > > > Valtoir
> > > >
> > > > 2009/5/18 Luciano Estevam Rangel 
> > > > <address@hidden<lrangel%40scopus.com.br>
> <lrangel%40scopus.com.br><mailto:
> > lrangel%40scopus.com.br <lrangel%2540scopus.com.br>> <lrangel%
>
> > 40scopus.com.br><mailto:
> > > lrangel%40scopus.com.br <lrangel%2540scopus.com.br>> >
> >
> > > >
> > > >>
> > > >>
> > > >> Boa tarde,
> > > >>
> > > >> Estou desenvolvendo um script e existe um problema no qual eu nao
> > > consigo
> > > >> achar uma resolução.
> > > >>
> > > >> Temos o arquivo x com o seguinte conteúdo
> > > >> valtoir@kraftwerk:~$ grep -o \".*\" t.txt
> > > >> "TESTE DE ARQUIVO.txt"
> > > >> "teste.txt"
> > > >>
> > > >>
> > > >> May 09 13:23 DENY user teste filename="TESTE DE ARQUIVO.txt"
> > > >>
> > > >> May 09 13:45 ACCEPT user teste cod 1234 filename="teste.txt"
> > > >>
> > > >> Meu problema e o seguinte
> > > >>
> > > >> Preciso crier um arquivo cujo o conteudo seja apenas o nome do user
> e
> > o
> > > >> arquivo, porem eles então em posição diferentes em cada linha, e o
> > outro
> > > >> problema e que o arquivo contem espaço então quando faço um awk ele
> so
> > > me
> > > >> retorna no exemplo do nome do arquivo "TESTE e não o nome completo,
> > > exemplo
> > > >> "TESTE DE ARQUIVO.txt" já quebrei a cabeça aqui com while e tudo
> mais
> > > >> ...Alguem poderia me dar uma luz de como pegar somente estes dois
> > > campos?
> > > >>
> > > >> Obrigado
> > > >>
> > > >> Luciano
> > > >>
> > > >> [As partes desta mensagem que não continham texto foram removidas]
> > > >>
> > > >>
> > > >>
> > > >
> > > >
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> > >
> > >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> >
> >
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>



-- 
Abraços,
Jeferson Santos


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

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