Я запускаю следующую команду:
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
)
Спасибо.
AWK очень силен и идеален для этого. В основном вы хотите:
Сохранить адрес в адресной строке Если ESSID соответствует вашему значению, напечатайте его. Самая короткая версия, о которой я мог подумать:
sudo iwlist wlan0 scan|awk '/Address:/{a=$5}/ESSID:"name"/{print a}'
/pattern/ - это регулярное выражение, которое сравнивается с входом. Если это совпадение, выполняется партия после фигурных скобок ({...}).
Команда awk обрабатывает ввод строки за строкой:
Сохраните адрес в адресная строка Если строка соответствует ESSID:"name", печатается переменная a (последний сопоставляемый адрес).Оба правила выполнены, но 1 до 2, поэтому a всегда задано.
Ручная страница для awk
Мое личное предпочтение этим вещам - это чистый баш. Сценарий ниже должен делать то, что вы ищете.
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-адрес, связанный с именем сети, как много раз по мере необходимости.
Я предлагаю изучить команду 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