Intereting Posts
Как получить размер данных, которые еще не были записаны на диск? Программно использовать visudo для редактирования sudoers? Что означает скобка в описании команды, например «mklost + found (8)» Установить статический IP-адрес, когда сервер DHCP недоступен Дайте пользователю разрешение на одну папку Как вызвать функцию оболочки в строке? (Баш) Верните первые несколько столбцов, опустите все после него до разделителя и добавьте остальные? Сценарий установки должен выполняться как определенный (обычный) пользователь, но ему необходимо создать системный каталог Как включить силовую обратную связь в ядре 2.6.34 – 64 бит? Установка Avahi на FreeBSD – Daemon не запускается Как отображать видео на моем заблокированном экране вместо обоев? Результаты поиска для '* .squashfs' для unsquashfs Получить список функций в общей библиотеке? Упрощенная навигация в терминале Как grep n-я подстрока между заданными разделителями?

grep для диапазона IP?

В окне RHEL 7 с локальным IP-адресом 10.0.0.159 следующая команда выводит IP 10.0.0.159 :

 $ echo "$(ifconfig eth0 | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | \ grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1')""(rw,sync)" 

Что команда должна изменить, чтобы вместо этого распечатать `10.0.0.0/8 ‘?

ПРИМЕЧАНИЕ: ifconfig является устаревшим cmd. Вы должны использовать cmds. в пакете iproute2 идем вперед. Ниже я покажу, как использовать ip для достижения того, что вы хотите, используя инструмент замены.


Вместо того, чтобы делать это с помощью ifconfig я бы рекомендовал вместо этого использовать команду ip .

IP CIDR

Эта форма показывает IP-адрес в нотации CIDR:

 $ ip addr list eth0 | awk '/inet.*brd/ {print $2}' 10.0.2.15/24 -or- $ ip al eth0 | awk '/inet.*brd/ {print $2}' 10.0.2.15/24 

Сетевой CIDR

Эта форма показывает сетевой адрес в нотации CIDR:

 $ ip route show | awk '/eth0.*scope/ {print $1}' 10.0.2.0/24 

ipcalc

Вы также можете использовать команду ipcalc для управления вышеуказанными адресами для вычисления других форматов. Например:

 $ ipcalc -n $(ip al eth0 | awk '/inet.*brd/ {print $2}') NETWORK=10.0.2.0 $ ipcalc -p $(ip al eth0 | awk '/inet.*brd/ {print $2}') PREFIX=24 

С ipcalc вы можете использовать его для более простого формирования любых вариаций, которые вам нужны, вместо того, чтобы делать много sed & awk для parsingа текста, который обычно слишком сложен для выполнения.

Чтобы из командной строки сделать то, что вы хотите, сначала нужно понять, что она делает. Вот анализ:

 echo "$()""(rw,sync)" 

Будет запускать something и принимать это как вход для вашего echo . Все остальное – обычный текст, который нужно echo .

 ifconfig eth0 

Получает информацию о сети.

 grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' 

Изолирует несколько IP-адресов в вашей системе. -E указывает grep использовать регулярные выражения, поэтому, например, вы можете использовать [0-9]* чтобы сопоставить все числа вместе. -o указывает grep выводить только ту часть, которая соответствует регулярному выражению, в отличие от вывода всей строки, соответствующей условию grep, как это было бы по умолчанию. Так, если, например, входной строкой является inet addr:10.0.0.159 Bcast:10.0.0.255 Mask:255.255.255.0 , она будет выводить только inet addr:10.0.0.159 без частей Bcast и Mask .

 grep -Eo '([0-9]*\.){3}[0-9]*' 

Это то же самое, что и выше, за исключением того, что без метки inet addr , что означает, что вы изолируете именно IP и удаляете метку. И наконец,

 grep -v '127.0.0.1' 

удаляет этот один IP из вашего списка выходов, потому что вас не волнует петлевой IP.


Как видите, ваша команда получает выходные данные ifconfig и фильтрует информацию, изолируя только ту часть информации, которая вам нужна. Он не делает никаких расчетов или обработки информации. Но вы хотите, чтобы он печатал подсеть и маску, которые являются информацией, которая явно не отображается в ifconfig . Другими словами, вы не можете просто отфильтровать вещи, чтобы получить то, что вы хотите. Вы должны будете выполнить некоторую обработку, некоторые вычисления, используя поле Mask в конце строки. Таким образом, вы не можете «изменить команду, чтобы распечатать то, что вы хотите». Вы должны создать совершенно другую команду.

В ответе slm используется аналогичный метод (отфильтровывая информацию, чтобы оставить только то, что вы хотите), но изменил ввод на команду, которая будет иметь нужную вам информацию. 🙂 Если у вас не было команды, которая выводила бы именно то, что вам нужно, и выполнение какой-либо обработки для нее было вашим единственным вариантом, вот ужасный набор if которые вы можете использовать в качестве примера или основы в будущем. Он использует первое решение slm и предполагает, что ваша маска всегда 8, 16 или 24.

 ip al eth1 | awk '/inet.*brd/ {split($2,add,"/");split(add[1],ip,".");if(add[2]<=24){ip[4]=0} if(add[2]<=16){ip[3]=0} if(add[2]<=8){ip[2]=0} print ip[1]"."ip[2]"."ip[3]"."ip[4]"/"add[2];}' 

Эта команда разделяет вывод ip между add ress (10.0.0.159) и mask (8). Затем он разбивает IP на 4 номера. Затем он устанавливает цифры в ноль в соответствии с маской. Но это не побитно, то есть это касается только масок 8, 16 и 24, потому что это то, что я жестко запрограммировал. 😉

Я надеюсь, что вы могли бы узнать немного больше об инструментах в вашей руке. ^ _ ^