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

Предположим, ваш tar-файл - $ TARBALL с абсолютным путем .

tar cfC $TARBALL /a/b/z .
tar AfC $TARBALL /e/f/z . 

Параметр -C изменяет каталог на следующий аргумент. Что неясно, так это то, что произойдет, если файлы с одинаковыми именами будут находиться в обоих каталогах.

Альтернативой является сохранение имен путей:

tar cf $TARBALL /a/b/z /e/f/z

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

2
11.08.2018, 05:30
2 ответа

ПРИМЕЧАНИЕ.:ifconfigявляется устаревшей командой. вы должны использовать 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 a l 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 a l eth0 | awk '/inet.*brd/ {print $2}')
NETWORK=10.0.2.0

$ ipcalc -p $(ip a l eth0 | awk '/inet.*brd/ {print $2}')
PREFIX=24

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

4
27.01.2020, 21:52

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

echo "$(<something>)""(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 a l 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между address (10.0.0.159 )и маской (8 ). Затем он разбивает IP на 4 номера. Затем он устанавливает числа равными нулю в соответствии с маской. Но он не побитовый, то есть будет работать только с масками 8, 16 и 24, потому что это то, что я жестко запрограммировал. ;)

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

3
27.01.2020, 21:52

Теги

Похожие вопросы