Самый простой способ получить информацию MAC и IP-адресов для локального интерфейса - это команда «ifconfig», обычно расположенная в '/ sbin/ifconfig'. В моем случае, я использую wlan0 в качестве основного интерфейса:
# /sbin/ifconfig wlan0
wlan0 Link encap:Ethernet HWaddr 86:75:30:9a:09:87
inet addr:10.20.30.40 Bcast:10.20.30.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1276663 errors:0 dropped:0 overruns:0 frame:0
TX packets:820927 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1233280913 (1.2 GB) TX bytes:105410513 (105.4 MB)
Самый простой пример, чтобы получить желаемый результат использует комбинацию эхо/Grep/СЭД/AWK:
echo $(/sbin/ifconfig wlan0 | \
grep -oE "(HWaddr\ |inet\ addr:)[0-9a-fA-F:\.]+" | \
sed 's/^\(HWaddr \|inet addr\:\)//') | \
awk '{print $2"*"$1}'
Синопсис:
Использование «-o» параметр в Grep будет выводить только, что соответствует в строке, а не самой линии.
«-E» сообщает grep ожидать «расширенного регулярного выражения» в соответствующих критериях. В этом случае мы ищем записи, начинающиеся с «HWaddr» или «inet addr:», за которыми следует любая комбинация символов «0-9», «a-z», «A-Z», «:» или ''.
Если вы закончите команду там, вы оставите две строки, которые выглядят как «HWaddr 86: 75: 30: 9a: 09: 87» и «inet addr: 10.20.30.40».
Нам нужны только MAC и IP-адреса, поэтому мы советуем sed избавиться от «HWaddr» и «inet addr:» от начала строки («^» означает начало).
Захват вывода из этой команды путем его обертывания в '$()' делает две строки в одну строку, разделенные пробелом. Добавление этого в команду «echo» позволяет нам использовать awk для замены пространства с помощью «*», делая окончательный вывод похожим на то, что ваш оригинальный «arp | awk '.
То, что мы остались с это так:
# echo $(/sbin/ifconfig wlan0 | grep -oE "(HWaddr\ |inet\ addr:)[0-9a-fA-F:\.]+" | sed 's/^\(HWaddr \|inet addr\:\)//') | awk '{print $2"*"$1}'
10.20.30.40*86:75:30:9a:09:87
Вы также можете сделать это в чистом Баше скрипте, используя свой встроенный движок регулярных выражений:
# IFS=$'\n' echo $(IFS=$'\n';
for LINE in $(ifconfig wlan0);
do if [[ "${LINE}" =~ .*(HWaddr\ |inet\ addr:)([0-9a-fA-F\:\.]+) || "${LINE}" =~ .*inet\ addr:([\d\.]+) ]];
then echo ${BASH_REMATCH[2]};
fi; done) | \
awk '{print $2"*"$1}'
172.16.17.40*a0:88:b4:78:65:04
... но это более болезненным, чтобы объяснить :-P
Как вы собираетесь обрабатывать несколько сетевых адаптеров? Кроме того, «ip addr show» обычно является хорошим подходом. –