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:22:31 -0300

Ô 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]