Фильтрация результатов в полезную переменную

Я запускаю следующую команду:

sudo iwlist eth0 scan

и получаю вывод, похожий на этот: починить ноутбук, и я не могу просто скопировать вывод.

Как я могу использовать встроенные инструменты, такие как grep, awk, sed и т. Д., Чтобы получать информацию по определенным критериям? Например:

Я хочу получить MAC-адрес при знании essid. Я также не хочу полагаться на позиции Cell # или линии. Знание общей информации, такой как слово Address, перед Mac - хорошо.

Ожидаемый результат:

AB:CD:EF:12:34:56

Я хочу использовать его в переменной, например так:

sudo iwconfig eth1 ap $(command)

Где команда приведет к ожидаемому результату. Если есть другой способ выдать результат как переменную, используя > или что-то еще, это тоже работает. (command > sudo iwconfig eth1 ap $1)

Спасибо.

0
задан 26 January 2012 в 06:06

3 ответа

Мое личное предпочтение этим вещам - чистая история. Сценарий ниже должен делать то, что вы ищете.

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)
}

После вставки вышеупомянутого в свой терминал вы сможете запустить get_mac_of_essid name, чтобы получить MAC-адрес, связанный с «именем» сети, столько раз, сколько необходимо.

0
ответ дан 26 January 2012 в 06:06

AWK очень мощный и идеально подходит для этого. Как правило, вы хотите:

  1. Сохранить адрес в адресной строке
  2. Если ESSID соответствует вашему значению, выведите его

Самая короткая версия I Можно подумать:

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

/pattern/ является регулярным выражением, которое сравнивается с вводом. Если он совпадает, выполняется часть после фигурных скобок ({...}).

Команда awk обрабатывает ввод построчно:

  1. Если строка соответствует Address:, пятое поле сохраняется в переменной с именем a. Поля - это разделенные пробелами строки.
  2. Если строка соответствует ESSID:"name", печатается переменная a (последний сопоставленный адрес).

Оба правила выполняются, но 1 стоит перед 2, поэтому всегда устанавливается a.

Страница справочника по awk

0
ответ дан 26 January 2012 в 06:06

Я предлагаю изучить команду cut. Это облегчает эту задачу. Простите echo, но я хотел продемонстрировать на оригинальных данных.

$ 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
0
ответ дан 26 January 2012 в 06:06

Другие вопросы по тегам:

Похожие вопросы: