2014-08-28 4 views
2

Я использую следующую команду для получения таблицы arp. Теперь я хочу добавить IP-адрес и MAC-адрес localhost к выходу. Как написать сценарий оболочки?Добавить IP-адрес и MAC-адрес локатора в сценарии оболочки

arp | grep -v 'incomplete' | tail -n+2 | awk '{print $1"*"$4}' 

Таким образом, результаты выглядят, как показано ниже (это добавляет Iface и IP узла сети к каждой строке записи таблицы ARP)

eno16777736 192.168.140.133 192.168.140.254,00:50:56:ef:2d:57 
eno16777736 192.168.140.133 192.168.140.2,00:50:56:ea:cf:bf 
+0

Как вы собираетесь обрабатывать несколько сетевых адаптеров? Кроме того, «ip addr show» обычно является хорошим подходом. –

ответ

3

На моей системе, я могу сделать:

arp | 
awk 'NR>1{mac[$NF]=mac[$NF]" "$3} END {for (iface in mac) print iface, mac[iface]}' | 
while read iface mac; do 
    inet=$(
     ifconfig "$iface" | 
     awk -v i=$iface '{for (j=1; j<NF; j++) if ($j == "inet") {print $(j+1); exit}}' 
    ) 
    echo $iface $inet ${mac// /,} 
done 
+0

, но если вы используете скрипты оболочки, arp будет «не найден» –

+1

Итак, используйте полный путь, например '/ usr/sbin/arp', или выполните' PATH = $ PATH:/usr/sbin' –

+0

благодаря Glenn.It очень близок к тому, что мне нужно. Я обновил вопрос о ожидаемых результатах. –

0

Самый простой способ получить информацию 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