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