Если вы планируете использовать php 5.4 и интерактивный cli (php -a), не забудьте также добавить пакет php5-readline.
Использование 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
Может возникнуть причудливый способ сделать это с помощью терминала, но я не знаю, как это сделать. Вот как я это сделаю, используя 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