Обрабатывает выходные данные ifconfig и hostname и помещает их в одну строку для нескольких хостов - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь отфильтровать MAC-адрес, IP-адрес и имя хоста удаленной машины из 100 машин. Первоначально я собираю информацию, используя приведенную ниже команду.

$for i in `cat IP`;do in ssh root@$IP "ifconfig eth0 && hostname " ;done

eth0      Link encap:Ethernet  HWaddr 00:MN:77:TR:XX:ZZ
          inet addr:192.168.122.25  Bcast:192.168.122.255  
          Mask:255.255.224.0
test.com-112304
eth0      Link encap:Ethernet  HWaddr 00:TT:77:MM:XX:YY
          inet addr:192.168.122.22  Bcast:192.168.122.255  
          Mask:255.255.224.0
test.com-11035

Первоначально перенаправление вывода в один файл. из их мне нужно обработать вывод, который приходит в вышеуказанном формате.

Я могу печатать IP и mac построчно следующим образом

$cat input | awk '/HWaddr/{printf $NF;printf " ";getline;print $2;}' | cut -c1-18,24-

00:MN:77:TR:XX:ZZ 192.168.122.25
00:TT:77:MM:XX:YY 192.168.122.22

На самом деле я хочу включить имя хоста вместе с выводом следующим образом

00:MN:77:TR:XX:ZZ 192.168.122.25  test.com-112304
00:TT:77:MM:XX:YY 192.168.122.22  test.com-11035

test.com будет общим именем для всех имен хостов. Я попытался перенаправить оба вывода в две переменные и вызвал следующим образом, но не повезло.

a=`cat input | awk '/HWaddr/{printf $NF;printf " ";getline;print $2;}' | cut -c1-18,24-`
b=`grep test.com input`
echo $a $b  | xargs -n2 

Пожалуйста, отбросьте взгляды

1 Ответ

0 голосов
/ 27 июня 2018

Я пытаюсь отфильтровать MAC-адрес, IP-адрес и имя хоста удаленной машины из 100 машин.

  1. MAC-адрес машины, с здесь : cat /sys/class/net/eth0/address
  2. У вас есть hostname утилита, почему бы вам просто не hostname -i? Вы можете анализировать ifconfig | grep inet | awk '{print $2}' | sed 's/addr://' и надеяться, что версии ifconfig одинаковы на всех компьютерах (некоторые версии ifconfig возвращают inet <ip> некоторые возвращают inet addr:<ip>, как у вас).
  3. Имя хоста с hostname

Сборка:

echo $(cat /sys/class/net/eth0/address) $(ifconfig eth0 | grep inet | awk '{print $2}') $(hostname)

Выполнение команды для каждой строки в каком-либо файле является заданием для xargs и помните о правильном экранировании аргументов:

cat IP | xargs -n1 -I{} ssh root@{} 'echo $(cat /sys/class/net/eth0/address) $(ifconfig eth0 | grep inet | awk '\''{print $2}'\'' | sed '\''s/addr://'\'') $(hostname)'

Если у вас действительно 100 машин, вас может заинтересовать ansible .

Если у вас действительно есть этот «входной» файл, и вы не можете его изменить, вы можете разобрать его следующим образом:

sed 's/eth0/#eth0/' input \
| xargs -d'#' -n1 -- bash -c '{ echo "$1" | grep HWaddr | awk "{print \$5}"; echo "$1" | grep inet | awk "{print \$2}" | sed "s/addr://"; echo "$1" | grep "^test.com"; } | tr "\n" " "; echo' --

И это ранит мне глаза :

for i in `cat IP`; then
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...