Мне нужно найти диапазон IP-адресов из моего файла аренды. Я пытаюсь использовать это
меньше /var /lib /dhcpd / | grep говорит, что диапазон от 192.23.253.2 до 192.23.253.100
какая команда будет работать для этого
Мне нужно найти диапазон IP-адресов из моего файла аренды. Я пытаюсь использовать это
меньше /var /lib /dhcpd / | grep говорит, что диапазон от 192.23.253.2 до 192.23.253.100
какая команда будет работать для этого
Я чувствую, что 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
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.
Если я правильно понимаю ваш вопрос, что-то вроде этого?
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;
}
Я не думаю, что вытягивание только цифр будет работать без поиска "метки", под которой они находятся.
Я не думаю, что вы можете получить минимум и максимум, как это, используя grep. Вы, вероятно, можете сделать это с помощью небольшой программы "awk".