Формирование IP-адресов из текстового файла

Если вы планируете использовать php 5.4 и интерактивный cli (php -a), не забудьте также добавить пакет php5-readline.

1
задан 13 April 2014 в 18:39

2 ответа

Использование GNU sed

Для этой цели вы также можете использовать sed. Распространение чисел в ipaddress присутствует между символами @@.

$ sed 's/.*@\(.*\)@.*@\(.*\)@.*@\(.*\)@.*@\(.*\)@.*/\1.\2.\3.\4/g' file
192.168.10.16
192.169.10.16
192.128.10.16
192.162.10.16
3] Команда ниже помещает номер в порядок перед выбранными ip-адресами,

$ sed 's/.*@\(.*\)@.*@\(.*\)@.*@\(.*\)@.*@\(.*\)@.*/\1.\2.\3.\4/g' file | awk '{ print NR". "$0}' 

Использование GNU sed

$ echo 'So what the@192@ heck are you doing@168@ in my house @10@.you were not @16@ supposed to be here.' | sed 's/.*@\(.*\)@.*@\(.*\)@.*@\(.*\)@.*@\(.*\)@.*/\1.\2.\3.\4/g' | awk '{ print NR". "$0}'
1. 192.168.10.16

Пожалуйста

sed 's/.*@\(.*\)@.*@\(.*\)@.*@\(.*\)@.*@\(.*\)@.*/\1.\2.\3.\4/g' file | awk '{ print NR". "$0}'
|                                                                   |   |                     |
|                                                                   |   |                     |
|<----------------------First part--------------------------------->|   |<-----Second part--->|   

OP упомянул, что адреса Ip скремблируются (распространяются) по всему файлу, каждая часть ipaddress заключена внутри @@, и каждая строка содержит четыре @...@ частей. Таким образом, он хочет получить все числа, присутствующие внутри @@, по очереди и печатает его в формате ip-адреса (xxx.xxx.xxx.xxx).

Первая часть

sed анализирует входной файл по строкам.

Рассмотрим приведенное ниже регулярное выражение в моем коде, а также вышеупомянутый пример. Мы должны дать регулярное выражение, которое соответствует всей строке, а также оно будет содержать выборки групп для извлечения слов в соответствии с нашими критериями, так что извлеченная группа будет повторно использована через обратную ссылку.

Пример строки:

So what the@192@ heck are you doing@168@ in my house @10@.you were not @16@ supposed to be here.

Regex:

.*@\(.*\)@.*@\(.*\)@.*@\(.*\)@.*@\(.*\)@.*

.*

Он соответствует любому символу 0 или более времени, кроме символа новой строки. [!d16 ]

@\(.*\)@

В sed, () (выборки групп) эти круглые скобки используются для извлечения группы символов или слов или чисел. По умолчанию sed использует базовое регулярное выражение, поэтому нам нужно избегать скобки, чтобы сделать выборку для работы. Но если вы используете sed с флагом -r (extended-regex), вам не нужно экранировать.

В нашем случае это \(.*\), и открытые, и закрытые скобки экранированы. На sed, читающем всю строку, он останавливает совпадение и начинает извлекать все символы или цифры или что-либо после символа @ и останавливает выборку, пока не найдет следующий символ @. Затем он сохраняет выбранную группу в специальном буфере, называемом (пространство шаблонов). так что извлеченные символы будут использоваться дальше. Теперь sed выбирает числа между первыми символами @@ (i, e.192).

.*

После того, как вы поймали первую группу, sed начинает анализировать следующие символы и совпадение 0 или более раз.

@\(.*\)@

Извлеките числа между вторыми символами @@. (i, e 168)

[d24 ] .*

Соответствует любому, а затем он перемещается.

@\(.*\)@

Извлеките числа между третьей частью @@ (т.е. 10 )

.*

Соответствует любому, а затем он перемещается.

@\(.*\)@

Извлеките числа между четвертым [ f44]. (т. е. 16)

.*

Символы, присутствующие после четвертого символа @@, могут быть или не быть. Таким образом, мы должны дать этому .* in-to, чтобы соответствовать всем символам после четвертой части @@.

Таким образом, sed выбирает точные числа, которые мы хотим, и храним их в буфере. [ ! d34]

Формат по умолчанию [синтаксис] sed,

sed 's/regex/replacement/g' file

код:

sed 's/.*@\(.*\)@.*@\(.*\)@.*@\(.*\)@.*@\(.*\)@.*/\1.\2.\3.\4/g' file

поэтому sed ищет совпадение этого регулярного выражения. Как только он найдет совпадение, он будет заменен запасной частью. Глобальный флаг g помогает заменить все вхождения строки регулярного выражения на замещающую часть. ([F52]).

В нашем случае регулярное выражение будет соответствовать первой строке, и вся строка будет заменена по выбранным группам 1, 2, 3, 4. Затем sed выполняет эту операцию на всех строках, которые соответствуют нашему регулярному выражению. В заменяемой части предварительно выбранным группам предшествует \. И, следовательно, он называется back-referencing. Если нам не удастся отделить группы . (точки),

\1\2\3\4

, выход будет

1921681016

. Поэтому нам нужно отделить группы с помощью [f59 ] (точки). Таким образом, это будет отображаться в формате ip-адреса.

\1.\2.\3.\4

Теперь выход будет:

192.168.10.16

Первая часть [!d42 ]

awk '{ print NR". "$0}'

Теперь вывод sed для первой строки будет 192.168.10.16. Этот выход был подан как вход во вторую команду awk.

Переменная Awk NR (количество записей) сохраняет номер строки или записи. Обратите внимание, что последнее значение NR быть последним номером строки. Подобно sed, awk анализирует входной файл по строкам. Таким образом, значение NR 1-й строки будет равно 1, а вторая строка будет 2 и так далее. В функции печати awk символ будет напечатан как есть, если он был помещен в двойные кавычки. Таким образом, он печатает . после номера строки (i, e current NR). $0 печатает всю строку, как есть.

Таким образом, вывод всей команды будет:

$ sed 's/.*@\(.*\)@.*@\(.*\)@.*@\(.*\)@.*@\(.*\)@.*/\1.\2.\3.\4/g' file | awk '{ print NR". "$0}'
192.168.10.16
192.169.10.16
192.128.10.16
192.162.10.16

Вы также можете использовать эту команду,

sed 's/.*@\([0-9]\+\)@.*@\([0-9]\+\)@.*@\([0-9]\+\)@.*@\([0-9]\+\)@.*/\1.\2.\3.\4/g' file

Пример:

$ echo 'So what the@192@ heck are you doing@168@ in my house @10@.you were not @16@ supposed to be here.' | sed 's/.*@\([0-9]\+\)@.*@\([0-9]\+\)@.*@\([0-9]\+\)@.*@\([0-9]\+\)@.*/\1.\2.\3.\4/g'
192.168.10.16
3
ответ дан 24 May 2018 в 09:31

Может возникнуть причудливый способ сделать это с помощью терминала, но я не знаю, как это сделать. Вот как я это сделаю, используя python

Скопируйте этот код в новый файл, назовите его whatEverYouWant.py и измените строку, в которой «input.txt» будет «yourFileWithIps.txt»

import re

validIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";

ips = []
with open('input.txt','r') as f:
    output = f.read()
    ips = re.findall(r'[0-9]+(?:\.[0-9]+){3}', output)

for x in range(1, len(ips) + 1):
    print str(x) + '.' + ips[x-1]

, затем с терминала перейдите к месту, где вы сохранили whatEverYouWant.py, и введите

python whatEverYouWant.py

, и это должно выводить то, что вы хотите.

Результаты моего собственного теста [ ! d4]

cam@cam-P5E:~/Desktop$ python getips.py
1.192.168.0.1
2.255.255.255.0
3.10.0.0.1
4.192.192.192.192
0
ответ дан 24 May 2018 в 09:31
  • 1
    Мой python-fu очень ограничен, но, насколько я могу судить, ваш скрипт ищет фактические IP-адреса, как в 123.456.7.8, но OP имеет номера компонентов, распределенные случайным образом в файле, предположительно обозначенные @. В любом случае ваш скрипт не дает результата в файле примера OP. – terdon♦ 13 April 2014 в 03:56
  • 2
    Я думаю, что ваше регулярное выражение должно включать что-то вроде (@(\d{1,3})@.*){4} (#NOTE untested), а именно. 4 группы из двух букв @ с промежутками между 1 и тремя цифрами, которые вы выбираете в качестве подгрупп. – don.joey 10 May 2014 в 13:56

Другие вопросы по тегам:

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