[shell-script] conjunção de comandos grep usando uma lista

2006-12-24 Por tôpico Jorge Barros de Abreu
Olá.

Atualmente tenho um trecho de código que está dessa forma:

LIST="palavra1 palavra2 palavra3 palavra4"
cat $ARQUIVO |\
grep -v "palavra1" |\
grep -v "palavra2" |\
grep -v "palavra3" |\
grep -v "palavra4" > relatorio.txt

Eu gostaria de fazer algo assim:
LIST="palavra1 palavra2 palavra3 palavra4"
cat $ARQUIVO | for i in LIST do grep -v $i done > relatorio.txt

O objetivo da mudança é restringir a alteração a um lugar somente. Da forma 
como está atualmente em caso de alteração tenho de modificar em dois lugares 
ficando a possibilidade de erro aumentada.

Qual a forma correta de fazer isso?

Obrigado.
-- 
Data Estelar 2454093.741690
http://usr.solar.com.br/~ficmatin
Desejo-lhe Paz, Vida Longa e Prosperidade.
São Bem Vindas Mensagens no Formato Texto Genérico com Acentos.




Re: [shell-script] conjunção de comandos grep usando uma lista

2006-12-24 Por tôpico Tiago Barcellos Peczenyj
Ola

Veja este exemplo:

$ seq 1 10 | grep -vE '2|3|4|5'
1
6
7
8
9
10

vc pode montar uma expressão regular com as suas palavras e usar um grep apenas.

 ;-)
On 12/24/06, Jorge Barros de Abreu <[EMAIL PROTECTED]> wrote:
>
> Olá.
>
>  Atualmente tenho um trecho de código que está dessa forma:
>
>  LIST="palavra1 palavra2 palavra3 palavra4"
>  cat $ARQUIVO |\
>  grep -v "palavra1" |\
>  grep -v "palavra2" |\
>  grep -v "palavra3" |\
>  grep -v "palavra4" > relatorio.txt
>
>  Eu gostaria de fazer algo assim:
>  LIST="palavra1 palavra2 palavra3 palavra4"
>  cat $ARQUIVO | for i in LIST do grep -v $i done > relatorio.txt
>
>  O objetivo da mudança é restringir a alteração a um lugar somente. Da forma
>  como está atualmente em caso de alteração tenho de modificar em dois lugares
>  ficando a possibilidade de erro aumentada.
>
>  Qual a forma correta de fazer isso?
>
>  Obrigado.
>  --
>  Data Estelar 2454093.741690
>  http://usr.solar.com.br/~ficmatin
>  Desejo-lhe Paz, Vida Longa e Prosperidade.
>  São Bem Vindas Mensagens no Formato Texto Genérico com Acentos.
>
>



-- 
Tiago B Peczenyj
Linux User #405772

# cd /pub
# more beer


Re: [shell-script] conjunção de comandos grep usando uma lista

2006-12-24 Por tôpico Sergio Nery Simoes
Olá Jorge,

A solução anterior cobre o caso de palavras com um prefixo comum.
Porém, caso as palavras sejam não tenham um prefixo comum, você pode usar
uma EXPREG  com agrupamento e "ou":

ER="(palavra1|palavra2|palavra3|palavra4)"
grep -vE "$ER" $ARQUIVO

outro exemplo:

ER="(bash|awk|sed|perl|python)"
grep -vE "$ER" $ARQUIVO


Att,
Sergio.



Em 24/12/06, Jorge Barros de Abreu <[EMAIL PROTECTED]> escreveu:
>
>   Olá.
>
> Atualmente tenho um trecho de código que está dessa forma:
>
> LIST="palavra1 palavra2 palavra3 palavra4"
> cat $ARQUIVO |\
> grep -v "palavra1" |\
> grep -v "palavra2" |\
> grep -v "palavra3" |\
> grep -v "palavra4" > relatorio.txt
>
> Eu gostaria de fazer algo assim:
> LIST="palavra1 palavra2 palavra3 palavra4"
> cat $ARQUIVO | for i in LIST do grep -v $i done > relatorio.txt
>
> O objetivo da mudança é restringir a alteração a um lugar somente. Da
> forma
> como está atualmente em caso de alteração tenho de modificar em dois
> lugares
> ficando a possibilidade de erro aumentada.
>
> Qual a forma correta de fazer isso?
>
> Obrigado.
> --
> Data Estelar 2454093.741690
> http://usr.solar.com.br/~ficmatin 
> Desejo-lhe Paz, Vida Longa e Prosperidade.
> São Bem Vindas Mensagens no Formato Texto Genérico com Acentos.
>
>  
>


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



[shell-script] Monitorar logs em real time

2006-12-24 Por tôpico Deivid Vilela
Amigos da lista

tenho a seguinte situação:
- um qmail com ocr ocasionalmente trava em determinados momentos e é necessário 
finalizar o processo do ocr para o mta continuar processando a fila de 
mensagens.
- este ocr quando trava envia um código de erro no arquivo /var/log/maillog

com um tail -f /var/log/maillog |grep (erro) 

eu consigo monitorar o erro manualmente e tenho que fazer isto porque não 
consegui encontrar uma forma de automatizar o processo. que me envie um e-mail 
caso isto ocorra...

eu tentei agendar isso a cada minuto pelo cron mas o volume de mensagens é 
muito grande e o log gira muito rápido para o script poder varrer isto.

no script o código não é tão dificil até que funcionou bem se não fosse o 
detalhe crucial que eu não consigo resolver e por isso pedi a ajuda da lista.

Existe alguma forma de manter o tail em loop dentro do script?

ou caso não seja o tail tem algum tipo de recurso que pode ser utilizado em que 
este log seja monitorado linha a linha?


PS: Não sei se perguntar sobre os comando é off aqui na lista caso seja basta 
ignorar a mensagem e obrigado.


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



Re: [shell-script] conjunção de comandos grep usando uma lista

2006-12-24 Por tôpico Jorge Barros de Abreu
Para fechar o tópico.

A solução surgiu graças à colaboração dos colegas de lista.

Eu preciso da LIST intacta para um processamento posterior.
A solução satisfatória ficou assim

cat $ARQUIVO | grep -vE "(`echo $LIST | tr ' ' '|'`)"  > relatorio.txt

Em 24/12/06, Jorge Barros de Abreu <[EMAIL PROTECTED]> escreveu:
> >   Olá.
> >
> > Atualmente tenho um trecho de código que está dessa forma:
> >
> > LIST="palavra1 palavra2 palavra3 palavra4"
> > cat $ARQUIVO |\
> > grep -v "palavra1" |\
> > grep -v "palavra2" |\
> > grep -v "palavra3" |\
> > grep -v "palavra4" > relatorio.txt
> >
> > Eu gostaria de fazer algo assim:
> > LIST="palavra1 palavra2 palavra3 palavra4"
> > cat $ARQUIVO | for i in LIST do grep -v $i done > relatorio.txt
> >
> > O objetivo da mudança é restringir a alteração a um lugar somente. Da
> > forma
> > como está atualmente em caso de alteração tenho de modificar em dois
> > lugares
> > ficando a possibilidade de erro aumentada.
> >
> > Qual a forma correta de fazer isso?
> >
> > Obrigado.
-- 
Data Estelar 2454094.075660
http://usr.solar.com.br/~ficmatin
Desejo-lhe Paz, Vida Longa e Prosperidade.
São Bem Vindas Mensagens no Formato Texto Genérico com Acentos.




[shell-script] Re: Não foi possível enviar sua mensagem

2006-12-24 Por tôpico Julio C. Neves
Fala Jorge,
vc poderia dar somente uma passada, não usando o for. Veja:

$ grep -Ev $(echo $LIST | sed 's/^/(/;s/ /|/g;s/$/)/') ARQUIVO

O sed transforma LIST em: (palavra1|palavra2|palavra3 |palavra4) e para o
grep -E esta construção significa palavra1 'ou' palavra2 'ou' ... 'ou'
palavran

O one-liner acima te facilita a manutenção, porém se vc não quiser nem
alterar o programa, use o melhor editor do mundo, o vi, para gravar um
arquivo com as palavras indesejadas e em seguida use a opção -f file do
grep. Veja o exemplo com números:

$ cat indesejados
2
4
6
8
10
$ cat num
1
2
3
4
5
6
7
8
9
10
$ grep -vf indesejados num
1
3
5
7
9

Feliz Natal a todos,
Julio
:wq


>
> Em 24/12/06, Jorge Barros de Abreu <[EMAIL PROTECTED]> escreveu:
> >
> >   Olá.
> >
> > Atualmente tenho um trecho de código que está dessa forma:
> >
> > LIST="palavra1 palavra2 palavra3 palavra4"
> > cat $ARQUIVO |\
> > grep -v "palavra1" |\
> > grep -v "palavra2" |\
> > grep -v "palavra3" |\
> > grep -v "palavra4" > relatorio.txt
> >
> > Eu gostaria de fazer algo assim:
> > LIST="palavra1 palavra2 palavra3 palavra4"
> > cat $ARQUIVO | for i in LIST do grep -v $i done > relatorio.txt
> >
> > O objetivo da mudança é restringir a alteração a um lugar somente. Da
> > forma
> > como está atualmente em caso de alteração tenho de modificar em dois
> > lugares
> > ficando a possibilidade de erro aumentada.
> >
> > Qual a forma correta de fazer isso?
> >
> > Obrigado.
> > --
> > Data Estelar 2454093.741690
> > http://usr.solar.com.br/~ficmatin 
> > Desejo-lhe Paz, Vida Longa e Prosperidade.
> > São Bem Vindas Mensagens no Formato Texto Genérico com Acentos.
> >
> >  
> >
>
>
>
> --
> Goles e abraços,
> Red
>



-- 
Goles e abraços,
Red


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