В то время как цикл вывода нескольких значений сравнения и эхо-сообщения, если разные

bash if-statement while-loop

105 просмотра

3 ответа

У меня есть настройка цикла для подачи в файл со списком IP-адресов. Цикл будет искать файл, используя IP-адреса, чтобы получить связанный MAC-адрес. Иногда для каждого IP-адреса указывается более одного MAC-адреса. Это может быть один или семь или более. Это действительно неизвестно. Все, что я знаю, это то, что мне нужно уметь сравнивать количество MAC, сообщаемых для каждого IP-адреса, и выводить что-то, если они не все совпадают. Вот как выглядит мой вывод скрипта:

Testing 192.168.17.25
00:0f:XX:41:e7:50; 00:0f:XX:41:e7:50; 00:0f:XX:41:e7:50; 
Testing 192.168.17.26
00:0f:XX:43:7a:f0; 00:0f:XX:43:7a:f0; 00:0f:XX:43:7a:f0; 00:0f:XX:43:7a:f0;

И вот мой цикл while:

cat $list | while read line;

do
echo "Testing $line"
var=$(/bin/grep -A 10 -w $line $file | /bin/grep 'ethernet' | /bin/awk '{print  $3}')
echo $var

done

Как я могу создать if / then, чтобы войти в цикл, чтобы сравнить MAC-адреса и вывести сообщение, если оно находит другое?

ОБНОВЛЕНИЕ: файл $ list - это простой текстовый файл с IP-адресами.

192.168.17.1

192.168.17.2

и т.д...

Файл $, через который я запускаю IP, чтобы получить MAC, является файлом аренды DHCP.

lease 192.168.17.28 {
starts 2 2016/07/12 07:36:15;
ends 3 2016/07/13 07:36:15;
tstp 3 2016/07/13 07:36:15;
tsfp 3 2016/07/13 19:36:15;
atsfp 3 2016/07/13 19:36:15;
cltt 2 2016/07/12 07:36:15;
binding state free;
hardware ethernet 84:7b:eb:24:87:ef;
uid "\001\204{\353$\207\357";

ОБНОВЛЕНИЕ: @ pakistanprogrammerclub

Когда я запускаю скрипт, я получаю:

[root@localhost]# ./genipmacs.sh < leasesfile > ipmaclist
awk: cmd. line:2: {ipmac[$1][$2]=1}
awk: cmd. line:2:           ^ syntax error
awk: cmd. line:6:     for(mac in ipmac[ip])
awk: cmd. line:6:                     ^ syntax error

Не уверен, чего здесь хочется. Что-то еще должно быть заключено в кавычки?

ОБНОВЛЕНИЕ № 2 @ pakistanprogrammerclub

После использования измененного кода awk скрипт запускается, как и ожидалось, без ошибок. Тем не менее, мой файл ipmaclist выглядит так:

 192.168.17.25 1       00:0
 00:0    4164    192.168.17.26
 192.168.17.27    1       192.168.17.28
 00:0    4164    192.168.17.29   192.168.17.30

Это не получает MAC по какой-то причине. Я думаю, что мне просто нужно настроить команды grep и sed в коде. Это кажется основной причиной. Запуск этих программ за пределами скрипта дает данные, которые вы видите выше, а затем awk пытается их проанализировать. Grep и sed вне сценария:

x.x.x.x x.x.x.x.  00:0
x.x.x.x.    00:0
x.x.x.x.  48:
x.x.x.x x.x.x.x  48:
x.x.x.x.   00:0

Похоже, что строка записи просто отрезает Mac.

ОБНОВЛЕНИЕ № 3

Новый контент ipmaclist:

00:0f:94:43:fd:d0       2       x.x.x.x
x.x.x.x.   1       dc:37:14:82:a2:82
x.x.x.x.  1       00:0f:94:41:d4:d0
x.x.x.x 1       00:0f:94:41:9f:e0

Лизинговый файл -

x.x.x.x
x.x.x.x
x.x.x.x
x.x.x.x

ОБНОВЛЕНИЕ 4

Новый код также работает, но в обратном порядке.

00:0f:94:c1:31:20       1       192.168.17.26
00:0f:94:c1:1f:30       3       192.168.17.27   192.168.17.28  192.168.17.29
00:0f:94:66:84:f0       1       192.168.17.30
Автор: user53029 Источник Размещён: 08.11.2019 10:54

Ответы (3)


2 плюса

Вместо того, чтобы просматривать их вручную, рассмотрите возможность использования sort -uдля удаления дубликатов, а затем wc -lдля подсчета.

unique_mac_addrs() {
     # First, split them up to individual lines, stripping out
     # any stray spaces or blank lines, then sort and count.
     echo "$@" | tr \; $'\n' | awk '$1{print $1}' | sort -u | wc -l
}
sample1="00:0f:XX:43:7a:f0; 00:0f:XX:43:7a:f0; 00:0f:XX:43:7a:f0; 00:0f:XX:43:7a:f0;"
sample2="00:0f:XX:43:7a:f0; FF:0f:XX:43:7a:f0; EE:0f:XX:43:7a:f0; 00:0f:XX:43:7a:f0;"
unique_mac_addrs $sample1  # => 1
unique_mac_addrs $sample2  # => 3
Автор: Dan Размещён: 20.08.2016 05:19

2 плюса

Этот подход использует gawk 4.0 для генерации списка MACS, разделенных табуляцией, и подсчета для каждого IP из файла аренды - назовите его ipmacslist:

10.0.1.1        1       00:11:22:33:44:55
10.0.1.2        2       00:11:22:33:44:56       00:11:22:37:44:56
10.0.1.3        1       00:11:22:33:44:57

Вы можете grep ipmacslist для вашего списка IP-адресов в $ list, а затем фильтровать по количеству:

grep -F -f$list ipmacslist|awk '$2 > 1'

Вот код для генерации ipmacslist - это конвейер - поместите его в скрипт скажем genipmacs.sh и передайте его содержимое файла аренды на stdin - ./genipmacs.sh <leasefile.leases >ipmacslist

# grep ip and mac from lease file
grep -Po '^lease \K[0-9.]*|hardware ethernet \K[0-9:a-f]*'|
# join pairs of consecutive lines to get ip-mac pair on one line
sed -n 'N; s/\n/\t/;p'|
# collect unique ip-mac pairs - output ip unique macs list and count
# uses gawk 4.0 2D arrays
awk '
# bail on invalid input
!/^[0-9.]+\t[0-9:a-f]+/ {
  printf("error line %d not IP-MAC pair: \"%s\"\n", NR, $0)
  exitstatus=1
  exit exitstatus
}
{ipmac[$1][$2]=1}
END {
  if(exitstatus) exit exitstatus
  for(ip in ipmac) {
    printf("%s\t%d", ip, length(ipmac[ip]))
    for(mac in ipmac[ip])
      printf("\t%s", mac)
    printf("\n")
  }
}
'
Автор: pakistanprogrammerclub Размещён: 20.08.2016 10:22

1 плюс

Решение pre-gawk 4.0 использует поддельный 2D-массив - это было болезненно - пожалуйста, обновите его до gawk 4.0 - ему уже несколько лет -

# grep ip and mac from lease file
grep -Po '^lease \K[0-9.]*|hardware ethernet \K[0-9:a-f]*'|
# join pairs of consecutive lines to get ip-mac pair on one line
sed -n 'N; s/\n/\t/;p'|
# collect unique ip-mac pairs - output ip unique macs list and count
awk '
# bail on invalid input
!/^[0-9.]+\t[0-9:a-f]+/ {
  printf("error line %d not IP-MAC pair: \"%s\"\n", NR, $0)
  exitstatus=1
  exit exitstatus
}
{
  if(($1, $2) in ipmac) next
  if($1 in macs) {
    macs[$1]=macs[$1] "\t" $2
  } else {
    ips[i++]=$1
    macs[$1]=$2
  }
  ++nmacs[$1]
  ipmac[$1, $2]=1
}
END {
  if(exitstatus) exit exitstatus
  for(i=0; i < length(ips); ++i) {
    ip=ips[i]
    printf("%s\t%d", ip, nmacs[ip])
    printf("\t%s\n", macs[ip])
  }
}
'

За ним следует его вывод и файл тестовой аренды

10.0.1.1        1       00:11:22:33:44:55
10.0.1.2        2       00:11:22:33:44:56       00:11:22:37:4f:56
10.0.1.3        2       00:11:22:33:44:57       00:11:22:a3:44:57

файл теста аренды

lease 10.0.1.1 {
  starts 5 2015/05/15 01:57:17;
  ends 5 2015/05/15 02:07:17;
  tstp 5 2015/05/15 02:07:17;
  cltt 5 2015/05/15 01:57:17;
  binding state free;
  hardware ethernet 00:11:22:33:44:55;
  client-hostname "host1";
  uid "foo";
}
lease 10.0.1.2 {
  starts 5 2015/05/15 02:09:16;
  ends 5 2015/05/15 02:19:16;
  tstp 5 2015/05/15 02:19:16;
  cltt 5 2015/05/15 02:09:16;
  binding state free;
  hardware ethernet 00:11:22:33:44:56;
  client-hostname "host2";
  uid "bar";
}
lease 10.0.1.3 {
  starts 5 2015/05/15 02:16:01;
  ends 5 2015/05/15 02:26:01;
  tstp 5 2015/05/15 02:26:01;
  cltt 5 2015/05/15 02:16:01;
  binding state free;
  hardware ethernet 00:11:22:33:44:57;
  client-hostname "host3";
  uid "baz-1";
}
lease 10.0.1.3 {
  starts 5 2015/05/15 02:17:01;
  ends 5 2015/05/15 02:27:01;
  tstp 5 2015/05/15 02:27:01;
  cltt 5 2015/05/15 02:17:01;
  binding state free;
  hardware ethernet 00:11:22:a3:44:57;
  client-hostname "host3";
  uid "baz-2";
}
lease 10.0.1.2 {
  starts 5 2015/05/15 02:09:16;
  ends 5 2015/05/15 02:19:16;
  tstp 5 2015/05/15 02:19:16;
  cltt 5 2015/05/15 02:09:16;
  binding state free;
  hardware ethernet 00:11:22:37:4f:56;
  client-hostname "host2";
  uid "bar-1";
}
Автор: pakistanprogrammerclub Размещён: 21.08.2016 05:20
Вопросы из категории :
32x32