[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
- especie de "if-then-else" com sed, Marcelo F Andrade, 2014/10/01
- Re: [shell-script] especie de "if-then-else" com sed, Tiago Peczenyj, 2014/10/01
- Re: [shell-script] especie de "if-then-else" com sed, Ronaldo Ferreira de Lima, 2014/10/01
- Re: [shell-script] especie de "if-then-else" com sed, Julio C. Neves, 2014/10/01
- Re: especie de "if-then-else" com sed, itamarnet, 2014/10/02
- Re: [shell-script] especie de "if-then-else" com sed, Paulo Bettega, 2014/10/02