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

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

Re: [shell-script] especie de "if-then-else" com sed


From: Ronaldo Ferreira de Lima
Subject: Re: [shell-script] especie de "if-then-else" com sed
Date: Thu, 2 Oct 2014 14:42:04 -0300
User-agent: mutt-ng/devel-r804 (Linux)

On Thu, Oct 02, 2014 at 10:17:23AM -0300, Marcelo F Andrade address@hidden 
wrote:
> 2014-10-01 17:14 GMT-03:00 Ronaldo Ferreira de Lima
> address@hidden [shell-script] <address@hidden>:
> > [...]
> > Achei a explicação um pouco confusa e incompleta, não há exemplos de
> > input e de output.
[...]
> A quem não conhece, quero tratar uma saída do iwlist como esta
> (mostrei apenas com as linhas relevantes):
> 
> [code]
> # iwlist wlan0 scan
> Cell 01 ...
> Quality=48/70 Signal level=-64 dBm
> Encryption key:off
> ESSID:"WifiAberta"
> ...
> Cell 02 ...
> Quality=20/70 Signal level=-90 dBm
> Encryption key:on
> ESSID:"WifiWEP"
> ...
> Cell 03 ...
> Quality=32/70 Signal level=-84 dBm
> Encryption key:on
> ESSID:"WifiWPA"
> ...
> IE: WPA Version 1
> ...
> [/code]
O  exemplo está  ótimo. Com  ele, consigo  reproduzir o  problema. Agora
entendi que eu não havia entendido nada :P.

> Minha intenção é associar ao evento da tecla do wifi do meu
> notebook com acpi um script que liste quais as redes sem-fio
> estão disponíveis. Por exemplo, mostrando o essid, a qualidade
> e o tipo de autenticação, se há.
Parece que é para uso pessoal, neste caso, não precisamos desenvolver um
parser formal para a saída do iwlist.

> Para isso comecei a fazer o seguinte (parece medonho, eu sei,
> mas com um pouco de atenção dá pra entender):
> [code]
> # iwlist wlan0 scan | grep -Eo
> '(ESSID:".+"|Quality=[0-9]{,2}/[0-9]{2}|Encryption key:(on|off)|WPA
> Version (1|2))' \
> | sed -nr 's/^ESSID:"(.+)"$/\1/p;
> s/^Quality=([0-9]{1,2}\/70)$/\1/p;s/^Encryption key:off$/open/p;
> s/^WPA Version (1|2)/wpa\1/p' \
> > output
> 48/70
> open
> WifiAberta
> 20/70
> WifiWEP
> 32/70
> wpa1
> WifiWPA
> [/code]
Havia  ficado  confuso  porque   você  utiliza  praticamente  as  mesmas
expressões regulares em múltiplos  lugares diferentes. A extensibilidade
(que é o seu problema no  momento) e a manutenibilidade ficam por demais
prejudicadas com isto e  as vezes impossíveis. No seu caso  o grep é até
inadequado  porque não  é  apenas  um simples  filtro  de  linhas e  sim
analisar cada  um dos  "Cell #" cuja  informação ocupa  quantidade quase
previsível de linhas (semelhante a "parágrafos").

> É por aí! Mas esse resultado seria mais legível num fomato
> tabular. No entanto, para casar legal, deveria ter 3 informações
> para cada rede wifi (da célula do meio só listou-se a qualidade
> e o essid). Gostaria de colocar nela um placeholder para indicar
> que a autenticação é WEP, para poder exibí-las em formato
> tabular, assim:
> 
> [code]
> # vi output #incluí manualmente uma linha "wep" abaixo do 20/70
> # cat output | awk '{ ORS=(NR%3?FS:RS) }1'
> 48/70 open WifiAberta
> 20/70 wep WifiWEP
> 32/70 wpa1 WifiWPA
> [/code]
> 
> Se eu aplicar esse awk com a saída original, como a célula 2
> só tem duas informações e estou agrupando os campos de
> três em três, todo o restante da saída fica desalinhado.
> 
> A questão era como colocar um placeholder wep no script na
> situação acima (o "else" do não-casamento do padrão).
> 
> BTW, se estiver num local onde só apareçam redes abertas
> ou com autenticação WPA, o script já funciona muito bem. :-)
> 
> Explicou ou complicou?
Explicou. Eu recomendo mudar a abordagem. Houve uma falha na "análise de
requisitos" e  é ela quem  está dificultando a compreensão  do problema.
Você pode resolvê-lo usando puro shell-script, basta que o interpretador
tenha  suporte a  regexp,  em sed  (mas  só com  ele  não será  possível
formatar  a saída  com  a indentação  esperada) ou  com  puro awk.  Pode
abandonar  o grep.  Em qualquer  uma das  opções, armazene  os dados  já
formatados para cada bloco processado deixando a impressão como processo
final. Aponte as dificuldade que encontrar.

> Atenciosamente.
> 
> --
> MARCELO F ANDRADE | Belem, Amazonia, Brazil | http://about.me/mfandrade

[]'s
-- 
"Não manejo bem as palavras
Mas manipulo bem as strings."
------------------------------
http://tecnoveneno.blogspot.com


reply via email to

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