Я хочу получить ip только из этого вывода, но я не знаю, как. Можно ли ограничить вывод только тем, что я хочу.
VPN Connection Setting Name |kap1
Destination VPN Server Host Name |159.89.199.192
Destination VPN Server Port Number |5252
Destination VPN Server Virtual Hub Name |kap
Proxy Server Type |Direct TCP/IP
Другая проблема. У ip есть порт. Мне нужен только ip. Извините за другой вопрос. Я ценю вашу помощь всем вам.
VPN Connection Setting Name |kap1
Status |Connected
VPN Server Hostname |159.89.199.192:5252 (Direct TCP/IP Connection)
Я ответил на ваш второй вопрос
@ 1995, постарайтесь собрать все вопросы в одном посте. Также добавьте свои усилия в свой пост, так как мы все здесь, чтобы учиться, ура.
Совет для новичков: если ответ решает вашу проблему, примите его, щелкнув большую галочку (✓) рядом с ним, и, при желании, проголосуйте за него (для голосования требуется не менее 15 очков репутации). Если вы нашли другие ответы полезными, проголосуйте за них. Принятие и голосование помогают будущим читателям. См. [Соответствующую статью Справочного центра] [1] [1]: stackoverflow.com/help/someone-answers





Учитывая, что данные, которыми вы поделились, сохраняются в файле. Имя файла: file.txt
$grep 'VPN Server Host Name' file.txt | awk -F '|' '{print $2}'
159.89.199.192
Хорошо, но вы можете объединить grep и awk в одной команде ;-)
@sonali, добро пожаловать в SO, пожалуйста, всегда оборачивайте свой код в CODE TAGS кнопку поиска {} для ваших сообщений, желаю вам удачи и продолжайте делиться знаниями :)
Конечно, так лучше :)
Представьте, что у вас есть входной файл:
$ cat vpn_info
Item |Value
--------------------------------------+--------
VPN Connection |kap1
Destination VPN Server Host Name |159.89.199.192
Destination VPN Server Port Number |5252
...
...
Затем вы можете использовать одну из следующих команд:
AWK:
awk -F '|' '/^Destination VPN Server Host Name/{print $2}' vpn_info
159.89.199.192
Вы определяете | как разделитель полей, а затем распечатываете 2-е поле ввода, когда строка начинается с Destination VPN Server Host Name.
САС:
sed -n 's/^Destination VPN Server Host Name *|//p' vpn_info
159.89.199.192
Вы просите sed заменить ^Destination VPN Server Host Name *| ничем, и когда он работает, вы распечатываете результат.
2-й вход:
$ cat vpn_info
Item |Value
--------------------------------------+--------
VPN Connection |kap1
VPN Server Hostname |159.89.199.192:5252 (Direct TCP/IP Connection)
AWK
$ awk -F '[:|]' '/VPN Server Hostname/{print $2}' vpn_info
159.89.199.192
Вы можете использовать эту команду awk, где вы указываете 2 разделителя полей : и |, и вы печатаете 2-е поле, когда дойдете до строки, содержащей VPN Server Hostname.
Спасибо. Оно работает! Не могли бы вы объяснить, что делает код? Я хочу понять это, чтобы научиться.
@ 1995: конечно !!! Я добавил несколько пояснений, есть ли какая-то конкретная часть, которая вам не понятна?
Наверное, все. Хахаха. Я собираюсь прочитать об awk и sed и попробовать изучить их. Еще раз спасибо. Последний вопрос, а что, если IP находится между ними. Таким образом, строка1 192.168.1.1 строка2.
@ 1995, проверьте и мое решение один раз, где я проверяю это второе поле с регулярным выражением об IP, хотя, поскольку ваше требование не так ясно, вы можете сообщить нам о полном вопросе, если это не сработает для вас.
@ RavinderSingh13 Я обновил свой вопрос. Надеюсь, ты сможешь мне помочь.
@ 1995: Я добавил ответ на ip с портом ;-)
@ 1995, пожалуйста, проверьте мое решение EDIT сейчас, также попробуйте задать все вопросы за один раз, дайте мне знать?
@Allan Спасибо, Аллан. Ваш код не так страшен для понимания. Хахаха. Я ценю вашу помощь.
Обновлено: Поскольку OP говорит, что OP имеет другой тип Input_file, поэтому теперь добавляем решение.
awk '/Hostname/ && match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/){print substr($0,RSTART,RLENGTH)}' Input_file
Здесь вам может помочь следующий awk.
awk -F"|" '/Destination VPN Server Host Name/ && $2 ~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/{print $2}' Input_file
ИЛИ ЖЕ
your_command | awk -F"|" '/Destination VPN Server Host Name/ && $2 ~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/{print $2}'
Это может сработать для вас (GNU sed):
sed -r '/\n/!s/([0-9]{1,3}\.){3}[0-9]{1,3}/\n&\n/;/^\S+[0-9]\n/P;D' file
Окружите все IP-адреса символами новой строки и печатайте только те строки, которые совпадают.
Первое регулярное выражение ищет новые строки. Новые строки - это то, что sed использует для разграничения строк, которые он помещает в пространство шаблонов (PS). Поэтому, как правило, новые строки никогда не будут естественным образом обнаружены в PS, если они не введены пользователем с помощью команды подстановки. Итак, первая команда говорит: «Если в пространстве шаблона уже нет новых строк, т.е. следующая замена уже была сделана. Заключите строку, которая выглядит как IP-адрес, новой строкой». IP-адрес соответствует от одной до трех цифр, за которыми следует точка, встречающаяся три раза, за которой следует от одной до трех цифр. Следующая команда sed печатает любые такие IP-адреса, а последняя команда удаляет первую строку в PS независимо от того, был ли это IP-адрес. Если PS пуст, после команды D считывается следующая строка, в противном случае sed снова циклически повторяет команды. Таким образом, общий эффект команд состоит в том, чтобы перечислить все IP-адреса в отдельных строках.
Спасибо. Я получил то, что хотел. Я все еще новичок в bash, поэтому я даже не понимаю код, который вы написали, но еще раз спасибо.
@ 1995 regexp - это небольшой язык, который позволяет вам проверять, находить и заменять строки внутри строк. Потратьте на них несколько минут, и они сэкономят вам часы спустя.
@potong Я изучал эта ссылка, но приведенный выше код мне все еще не совсем понятен. Не могли бы вы добавить пошаговое объяснение человек читаемый?
Не могли бы вы скопировать и вставить содержимое изображения? Спасибо