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

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

sudo iwlist eth0 scan

и получаю вывод, который выглядит так:

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

Я не собираюсь заполнять все это, m пытается исправить ноутбук, и я не могу просто скопировать вывод.

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

Я хочу захватить адрес mac, зная эссенцию. Я также не хочу полагаться на позиции Cell # или линии.

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

AB:CD:EF:12:34:56

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

sudo iwconfig eth1 ap $(command)

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

Спасибо.

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

3 ответа

AWK очень силен и идеален для этого. В основном вы хотите:

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

. Самая короткая версия, о которой я мог подумать:

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

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

Команда awk обрабатывает ввод строки за строкой:

Сохраните адрес в адресная строка Если строка соответствует ESSID:"name", печатается переменная a (последний сопоставляемый адрес).

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

Ручная страница для awk

1
ответ дан 25 May 2018 в 14:51
  • 1
    Можете ли вы объяснить, как это работает? – Brian Graham 1 February 2012 в 09:07
  • 2
    @BrianGraham Я думал, что это довольно понятно. Добавлены дополнительные сведения. – Lekensteyn 1 February 2012 в 19:34

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

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-адрес, связанный с именем сети, как много раз по мере необходимости.

2
ответ дан 25 May 2018 в 14:51
  • 1
    Хороший сценарий, надеюсь, что это то, что OP после =) – Panther 26 January 2012 в 08:26
  • 2
    Это будет работать, если бы у меня был доступ к файловой системе. Я не могу записать информацию на диск, он был поврежден. – Brian Graham 26 January 2012 в 09:00
  • 3
    Нет записи - труба через файловый дескриптор, для которого физический файл не должен быть создан. Вы пробовали это, и это не сработало? EDIT: ах, я понимаю, что вы имеете в виду, написание самого скрипта. Через секунду я обновлю свой пост. – pablomme 26 January 2012 в 09:09
  • 4
    Там это должно сделать. – pablomme 26 January 2012 в 09:18

Я предлагаю изучить команду 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
1
ответ дан 25 May 2018 в 14:51
  • 1
    Как это будет работать, если есть более одной ячейки (есть 15 на моем ноутбуке)? Что бы я сделал, чтобы найти Address, учитывая ESSID? – Brian Graham 26 January 2012 в 20:59
  • 2
    Я думаю, вы имеете в виду что-то вроде этого (при условии, что значение ESSID, на которое вы хотите получить адрес, является «fnorg722»): sudo iwlist wlan0 scanning | egrep 'ESSID|Address' | cut -d: -f2- | grep -B 1 fnorg722 `14: D6: 4D: 2D: 5F: AE` "fnorg722" – waltinator 31 January 2012 в 01:44

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

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