1

Мне нужно найти диапазон IP-адресов из моего файла аренды. Я пытаюсь использовать это

меньше /var /lib /dhcpd / | grep говорит, что диапазон от 192.23.253.2 до 192.23.253.100

какая команда будет работать для этого

4 ответа4

3

Я чувствую, что awk - более гибкий инструмент для этой задачи. Также можно использовать Python, но вам придется писать скрипт вместо копирования и вставки команды в терминал. Вам придется изменить шаблоны регулярных выражений, разделители записей и разделители полей, чтобы они работали с вашим файлом. Если вы можете предоставить пример из вашего файла (с удалением или изменением конфиденциальных данных), я отредактирую этот ответ.

Тестовый файл (скопированный из другого примера SO и настроенный):

lease 192.23.253.2 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:00;
    uid 00:00:00:00:00:00;
    client-hostname "examle-workstation1";
}
lease 192.23.253.3 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:00;
    uid 00:00:00:00:00:00;
    client-hostname "examle-workstation1";
}
lease 192.23.253.4 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:00;
    uid 00:00:00:00:00:00;
    client-hostname "examle-workstation1";
}
lease 192.23.253.5 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:00;
}
lease 192.23.253.6 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:01;
    uid 00:00:00:00:00:01;
    client-hostname "examle-workstation2";
}
lease 192.23.253.7 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 01:00:00:00:00:00;
}

Если вы хотите всю запись:

$ awk 'BEGIN{
      RS="lease"
      FS=" {+|;\n"
  }{
      n=split($1, a, ".")
      last=int(a[n])
      if( 3 <= last && last <= 6){
          print
      }
  }' testfile

Что происходит в этом заявлении awk :

  • Установите значение разделителя записей: RS="lease" .
  • Задайте значение разделителя полей для поиска { перед пробелом или ;\n: FS=" {+|;\n" .
  • Разделите первое поле в каждой записи в любой . , сохранить результирующий массив в a , сохранить длину a в n .
  • Храните последний элемент в a
  • Проверьте, равно ли значение last меньше или равно нашему минимуму (2) или last равно или больше нашего максимума (6), если это правда, выведите всю запись.

Результаты:

 192.23.253.3 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:00;
    uid 00:00:00:00:00:00;
    client-hostname "examle-workstation1";
}

192.23.253.4 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:00;
    uid 00:00:00:00:00:00;
    client-hostname "examle-workstation1";
}

192.23.253.5 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:00;
}

192.23.253.6 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:01;
    uid 00:00:00:00:00:01;
    client-hostname "examle-workstation2";
}

Если вы хотите только IP-адреса:

$ awk 'BEGIN{
     RS="lease"
     FS=" {+|;\n"
  }{
      n=split($1, a, ".")
      last=int(a[n])
      if( 3 <= last && last <= 6){
          ip=gensub(/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*/,"\\1","", $1)
          print ip
      }
  }' testfile

Что происходит в этом заявлении awk :

  • Установите значение разделителя записей: RS="lease" .
  • Задайте значение разделителя полей для поиска { перед пробелом или ;\n: FS=" {+|;\n" .
  • Разделите первое поле в каждой записи в любой . , сохранить полученный массив в a , сохранить длину a в n .
  • Храните последний элемент в a
  • Проверьте, равен ли last наш минимум или меньше нашего минимума (2) или last равен или больше нашего максимума (6), если это так, используйте метод last чтобы удалить все, кроме IP-адреса, с помощью регулярных выражений. шаблон.

Результаты:

192.23.253.3
192.23.253.4
192.23.253.5
192.23.253.6
1
less /var/lib/dhcpd/ | grep 192\.23\.253\. |grep -vi 192\.23\.253\.1\s |grep -vi 192\.23\.253\.2[0-9][0-9] |grep -vi 192\.23\.253\.1[0-9][1-9] |grep -vi 192\.23\.253\.1[1-9]0 |grep -vi 192\.23\.253\.0

Там только grep.

1

Если я правильно понимаю ваш вопрос, что-то вроде этого?

root@kali:/var/lib/dhcp# sed -n -e '/20:40:42/,/12:25:01/p' dhclient-ce17152e-8364-40bd-a3d9-5d916e421dc3-wlan0.lease | grep "expire" > narc.txt && cat narc.txt
  expire 5 2015/08/14 20:40:42;
  expire 6 2015/08/15 12:25:01;

Так,

root@kali:/var/lib/dhcp# sed -n -e '/<range-from-start>/,/<range-to-end>/p' <EXACT-LOCATION-AND-FILENAME> | grep "<beginning-line-entry-of-lease-file>" > <output-file> && cat <output-file>
  expire 5 2015/08/14 20:40:42;
  expire 6 2015/08/15 12:25:01;

Аренда из моего компьютерного файла выглядит следующим образом

lease {
  interface "wlan0";
  fixed-address 192.168.254.25;
  option subnet-mask 255.255.255.0;
  option dhcp-lease-time 86400;
  option routers 192.168.254.254;
  option dhcp-message-type 5;
  option dhcp-server-identifier 192.168.254.254;
  option domain-name-servers 192.168.254.254;
  option dhcp-renewal-time 43200;
  option dhcp-rebinding-time 75600;
  option broadcast-address 192.168.254.255;
  option host-name "kali";
  option domain-name "netgear.com";
  renew 5 2015/08/14 08:37:20;
  rebind 5 2015/08/14 17:40:42;
  expire 5 2015/08/14 20:40:42;
}
lease {
  interface "wlan0";
  fixed-address 192.168.254.25;
  option subnet-mask 255.255.255.0;
  option routers 192.168.254.254;
  option dhcp-lease-time 86400;
  option dhcp-message-type 5;
  option domain-name-servers 192.168.254.254;
  option dhcp-server-identifier 192.168.254.254;
  option dhcp-renewal-time 43200;
  option broadcast-address 192.168.254.255;
  option dhcp-rebinding-time 75600;
  option host-name "kali";
  option domain-name "netgear.com";
  renew 6 2015/08/15 00:05:34;
  rebind 6 2015/08/15 09:25:01;
  expire 6 2015/08/15 12:25:01;
}

Я не думаю, что вытягивание только цифр будет работать без поиска "метки", под которой они находятся.

0

Я не думаю, что вы можете получить минимум и максимум, как это, используя grep. Вы, вероятно, можете сделать это с помощью небольшой программы "awk".

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .