Filtre os resultados em uma variável utilizável

0

Eu corro o seguinte comando:

sudo iwlist eth0 scan

e obtenha uma saída assim:

Cell 01 - Address: AB:CD:EF:12:34:56
          ESSID:"name"
          Protocol:IEEE 802.11g
          Mode:master
          Frequency:2.417 GHz (Channel 2)
          Encryption key:on

Eu não vou me incomodar em preencher tudo, já que estou tentando consertar um laptop e não posso simplesmente copiar a saída.

Como posso usar ferramentas internas, como grep , awk , sed etc., para buscar informações com determinados critérios? Por exemplo:

Eu quero pegar o endereço mac quando souber o essencial. Eu também não quero confiar nas posições Cell # ou line. Saber informações comuns, como a palavra Address antes do mac, é bom.

Resultado esperado:

AB:CD:EF:12:34:56

Eu quero usá-lo em uma variável, assim:

sudo iwconfig eth1 ap $(command)

Onde o comando resultaria no resultado esperado. Se há outra maneira de empurrar o resultado como uma variável usando > ou algo assim, isso também funciona. ( command > sudo iwconfig eth1 ap $1 )

Obrigado.

    
por Brian Graham 26.01.2012 / 02:55

3 respostas

1

O AWK é muito poderoso e perfeito para isso. Basicamente, você quer:

  1. Salve o endereço na linha de endereço
  2. Se o ESSID corresponder ao seu valor, imprima-o

A versão mais curta que eu pude pensar:

sudo iwlist wlan0 scan|awk '/Address:/{a=$5}/ESSID:"name"/{print a}'

/pattern/ é uma expressão regular que é comparada com a entrada. Se coincide, a parte depois das chaves ( {...} ) é executada.

O comando awk processa a linha de entrada por linha:

  1. Se uma linha corresponder a Address: , o quinto campo será armazenado em uma variável chamada a . Os campos são linhas delimitadas por espaços em branco.
  2. Se uma linha corresponder a ESSID:"name" , a variável a será impressa (o último endereço correspondente).

As duas regras são executadas, mas 1 vem antes de 2, então a é sempre definido.

Página do manual do awk

    
por Lekensteyn 26.01.2012 / 16:25
2

Minha preferência pessoal por essas coisas é pura bash. O script abaixo deve fazer o que você está procurando.

get_mac_of_essid() {
 target_essid="$1"
 [ -z "$target_essid" ] && return
 interface=eth0

 # Ask for password now instead of in the middle of pipe below
 sudo -v

 mac="" ; essid=""
 {
  while read line ; do
   set -- $line
   if [ "$1" = Cell ] ; then
    # New network, so reset variables
    mac="" ; essid=""
    shift 3
   fi
   case "$1" in
   Address:)
    mac="$2" # MAC is on this line, second field
    ;;
   ESSID:*)
    essid="${1#ESSID:}" # ESSID is on this line, first field after ':'
    essid="${essid#\"}" # Remove duoble quote at start
    essid="${essid%\"}" # Remove double quote at end
    ;;
   esac
   if [ "$essid" = "$target_essid" ] && [ ! -z "$mac" ] ; then
    echo "$mac" ; return
   fi
  done
 } < <(sudo iwlist $interface scan)
}

Depois de colar as informações acima no seu terminal, você poderá executar get_mac_of_essid name para obter o endereço MAC associado ao "nome" da rede quantas vezes forem necessárias.

    
por pablomme 26.01.2012 / 03:18
1

Sugiro que você aprenda o comando cut . Isso torna esta tarefa fácil. Perdoe o echo , mas queria demonstrar nos dados originais.

$ echo 'Cell 01 - Address: AB:CD:EF:12:34:56  
          ESSID:"name"  
          Protocol:IEEE 802.11g  
          Mode:master  
          Frequency:2.417 GHz (Channel 2)  
          Encryption key:on' | egrep Address | cut '-d:' -f2-  
 AB:CD:EF:12:34:56  

$ echo 'Cell 01 - Address: AB:CD:EF:12:34:56  
          ESSID:"name"  
          Protocol:IEEE 802.11g  
          Mode:master  
          Frequency:2.417 GHz (Channel 2)  
          Encryption key:on' | egrep ESSID: | cut '-d"' -f2
name
    
por waltinator 26.01.2012 / 15:47