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

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

Re: [shell-script] Alterar linhas em um arquivo via shell script


From: Julio C. Neves
Subject: Re: [shell-script] Alterar linhas em um arquivo via shell script
Date: Fri, 9 Mar 2007 11:32:59 -0300

Fala Cristian,
Depois que mandei é que vi que vc queria trocar mais de um lab de cada vez.
É só fazer assim:

$ cat troca.sh
for LAB
do
     sed -i "s/^#\(.*lab$LAB$\)/\^\1/;s/^\(http.*lab$LAB$\)/#\1/;s/^\^//"
s.conf
done

$ cat s.conf
#http_access deny lab1
http_access allow lab1

#http_access deny lab2
http_access allow lab2

#http_access deny lab3
http_access allow lab3

#http_access deny lab4
http_access allow lab4
$ ./troca.sh 2 3 1
$ cat s.conf
http_access deny lab1
#http_access allow lab1

http_access deny lab2
#http_access allow lab2

http_access deny lab3
#http_access allow lab3

#http_access deny lab4
http_access allow lab4


Em 09/03/07, Julio C. Neves <address@hidden> escreveu:
>
> Ô Bruno,
> vc mandou fazer em PHP pq não conhece Cobol, se conhecesse, provavelmente
> aconselharia o uso desta linguagem :). Mas de qq forma isso aqui é uma lista
> de Shell e como diz no rodapé de todas as msgs:
> ---------------------------------------------------------------------
> Esta lista não admite a abordagem de outras liguagens de programação, como
> perl, C etc. Quem insistir em não seguir esta regra será moderado sem prévio
> aviso.
> ---------------------------------------------------------------------
> Portanto vamos falar em shell antes que te modere. Se vc quiser, *em pvt*
> (pq se vc voltar a tocar no assunto na lista, vou te moderar) aposto um
> chope contigo que para resolver este problema ou qq outro que trabalhe com
> arquivos planos o shell dá banho de performance no PHP, até pq o PHP
> *obrigatóriamente* terá de rodar sob um shell.
>
> Christian, vamos ao que interessa,: tentei fazer um genérico pq acho que
> foi isso que vc queria qdo disse aleatorio. Veja:
>
> $ cat troca.sh
> sed "s/^#\(.*lab$1$\)/\^\1/;s/^\(http.*lab$1$\)/#\1/;s/^\^//" s.conf
>
> Veja as explicações do Tiago e complemente com estas:
> Os ponto-e-vírgula dividem o sed em 3 pedaços que são executados na ordem
> em que aparecem. O artifício que usei foi procurar a linha que termina pelo
> lab desejado e está comentada (começa por #) e trocar o jogo-da-velha por um
> circunflexo, em seguida pego a descomentada (começa por http) e termina pelo
> lab desejado e ponho um comentario (#) e, para terminar, extraio o
> circunflexo que tinha colocado.
>
> 1o. Pedaço - s/^#\(.*lab$1$\)/\^\1/
> Aqui os parênteses precisam de ser escapados com contrabarras e servem
> para armazenar o conteúdo entre eles. O resto da linha diz: substitua (s) a
> linha que começa (^) por jogo-da-velha e termina (o último $) em lab seguido
> do parâmetro passado ($1), por cincunflexo (^) seguido do resto da linha sem
> o jogo-da-velha.
>
> O resto da linha é o que estava entre parênteses, que foi chamado de volta
> pelo uso do \1.
>
> 2o. Pedaço - s/^\(http.*lab$1$\)/#\1/
> Bastante parecido com o primeiro. troque (s) a linha que começa (^) por
> http e termina (o último $) em lab seguido do parâmetro passado ($1), por #
> seguido pelo restante da linha (ou seja, o \1 está devolvendo o que foi
> guardado pelos parênteses).
>
> 3o. Pedaço - s/^\^//
> Troca o circunflexo (o segundo) que começa (o primeiro) um linha por nada.
>
> A vantagem deste método é que vc passa somente o número do lab como
> parâmetro e seu estado é trocado, isto é, permite comentar a linha do allow
> e descomentar o do deny correspondente ou vice versa. Teste e, caso vc
> goste, troque sed por sed -i, para que as alterações se reflitam no arquivo
> (por enquanto só aparece na tela).
>
> Agora me diga: se em Shell um one-liner que faz isso tudo, para que usar
> outra linguagem. No teste a seguir passei o 3 como parâmetro para alterar o
> lab3.
>
> $ ./troca.sh 3
> #http_access deny lab1
> http_access allow lab1
>
> #http_access deny lab2
> http_access allow lab2
>
> http_access deny lab3
> #http_access allow lab3
>
> #http_access deny lab4
> http_access allow lab4
> $ cat troca.sh
> sed "s/^#\(.*lab$1$\)/\^\1/;s/^\(http.*lab$1$\)/#\1/;s/^\^//" s.conf
>
>
> Em 09/03/07, Bruno Gunter Fricke <address@hidden> escreveu:
> >
> >   Porque o PHP vai trabalhar muito melhor os casos do que o shell. Não é
> > que seja impossível, apenas não será prático, sem contar que o shell é
> > muito mais lento do que o PHP. Talvez, seja melhor até fazer em Perl.
> >
> > Ou será que você é daqueles que "acham" que o shell conecta em banco de
> > dados também? ;-)
> >
> > []'s
> > Gunter
> >
> >
> > On Fri, 2007-03-09 at 08:10 -0300, Tiago Barcellos Peczenyj wrote:
> > > Por que PHP?
> > > É impossivel fazer via qualquer comando interno do shell ou ferramenta
> > > basica do mundo unix?
> > >
> > > Uma solução, para comentar, seria utilizar o sed com a opção -i para
> > > que ,
> > > na linha que vc quer, ele substituisse a linha por ela mesma porem com
> > > um
> > > simbolo de # na frente
> > >
> > > sed -i 's/REGRA/#&/' arquivo
> > >
> > > agora e para descomentar?
> > >
> > > sed -i '/REGRA/s/^#//'
> > >
> > > ou seja, na ocorrencia da regra, ele vai trocar o simbolo # do começo
> > > da
> > > linha por nada.
> > >
> > > Pode ficar melhor? Pode, existem N formas, esta é só uma.
> > >
> > > []´s Tiago
> > >
> > > On 3/9/07, Bruno Gunter Fricke <address@hidden<gunter%40infolink.com.br>>
> > wrote:
> > > >
> > > > Use PHP.
> > > >
> > > >
> > > > ----- Original Message -----
> > > > From: kblocat
> > > > To: address@hidden<shell-script%40yahoogrupos.com.br><shell-script%
> > > 40yahoogrupos.com.br>
> > > > Sent: Thursday, March 08, 2007 11:34 PM
> > > > Subject: [shell-script] Alterar linhas em um arquivo via shell
> > > script
> > > >
> > > > Pessoal, boa noite.
> > > >
> > > > Meu problema é o seguinte :
> > > >
> > > > Preciso liberar/bloquear laboratórios através do squid.conf, ou
> > > seja :
> > > >
> > > > #http_access deny lab1
> > > > http_access allow lab1
> > > >
> > > > #http_access deny lab2
> > > > http_access allow lab2
> > > >
> > > > #http_access deny lab3
> > > > http_access allow lab3
> > > >
> > > > #http_access deny lab4
> > > > http_access allow lab4
> > > >
> > > > Resumindo, dependendo da solicitação do usuário, por exemplo: Ele
> > > quer
> > > > bloquear a Internet no lab 1 e lab3
> > > >
> > > > Beleza, é só comentar a linha allow dos labs 1 e 3 e descomentar as
> > > linhas
> > > > com deny.
> > > >
> > > > Montei arquivos squid.conf com as linhas comentadas e depois o
> > > script
> > > > deletava e renomeava os arquivos.
> > > >
> > > > Mas às vezes o cara quer liberar e bloquear em sequencias
> > > aleatórias, aí
> > > > teria que criar arquivos com todas as combinações possíveis, além
> > > disso
> > > > qquer alteração no squid.conf, teria que replicar nos demais: mó
> > > trampo.
> > > >
> > > > Qual a pergunta: teria como eu comentar/descomentar as linhas de
> > > acordo
> > > > com
> > > > a seleção aleatória do usuário via shell, sem que ele tenha que
> > > editar o
> > > > squid.conf no braço ?
> > > >
> > > > Tá lançado o desafio. Aguardo sugestões .
> > > >
> > > > Obrigado
> > > >
> > > > Christian
> > > >
> > > > [As partes desta mensagem que não continham texto foram removidas]
> > > >
> > > > [As partes desta mensagem que não continham texto foram removidas]
> > > >
> > > >
> > > >
> > >
> > > --
> > > Tiago B Peczenyj
> > > Linux User #405772
> > >
> > > # cd /pub
> > > # more beer
> > >
> > > [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]



reply via email to

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