Linux переменная ip адрес

Extracting IP address from a text and store it in a variable

I want to extract only IP address from the text and store it in a variable and use for other purpose. I have tried this.

for line in `cat abd` do ip=`grep -o '4\\.2\\.7\\.1\' $line` echo $ip done 
grep: 34782: No such file or directory grep: 128.206.6.137: No such file or directory grep: 12817: No such file or directory grep: 23.234.22.106: No such file or directory 

If there are tons of other IPs, then I think my answer best answers what it appeared as if you were actually trying to do, despite other users’ negative votes and comments toward my answer. Can you clarify your question? Are you wanting to go through each IP in order and say something about it or do something with it, or are you going to reference each IP individually with a separate variable? If you are wanting to go in order (within the loop) you only need a single $ip variable per iteration, and there is no need for an array or to reference a specific IP address outside the loop.

5 Answers 5

You almost had it right the first time. The awk answer is good for your specific case, but the reason you were receiving an error is because you were trying to use grep as if it were searching for a file instead of a variable.

Also, when using regular expressions, I always use grep -E just to be safe. I have also heard that backticks are deprecated and should be replaced with $() .

The correct way to grep a variable with on shells that support herestrings is using input redirection with 3 of these guys: < , so your grep command ( $ip variable) should actually read as follows:

If it is a file you are searching, I always use a while loop, since it is guaranteed to go line-by-line, whereas for loops often get thrown off if there is any weird spacing. You are also implementing a useless use of cat which could be replace by input redirection as well. Try this:

while read line; do ip="$(grep -oE '6\.3\.9\.7'  

Also, I don't know what OS or version of grep you are using, but the escape character you had before the curly braces is usually not required whenever I have used this command in the past. It could be from using grep -E or because I use it in quotes and without backticks -- I don't know. You can try it with or without and just see what happens.

Whether you use a for loop or a while loop, that is based on which one works for you in your specific situation and if execution time is of utmost importance. It doesn't appear to me as if OP is trying to assign separate variables to each IP address, but that he wants to assign a variable to each IP address within the line so that he can use it within the loop itself -- in which case he only needs a single $ip variable per iteration. I'm sticking to my guns on this one.

Источник

Помещение IP-адреса в переменную bash. Есть ли способ лучше

Я пытаюсь найти короткий и надежный способ поместить мой IP-адрес в переменную bash, и мне было любопытно, есть ли более простой способ сделать это. Вот как я сейчас это делаю:

ip=`ifconfig|xargs|awk ''|sed -e 's/[a-z]*:/''/'` 

20 ответов

Вы можете взглянуть на этот сайт для альтернатив.

ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '< print $1>' 

Немного меньше, хотя это совсем не надежно и может вернуть неправильное значение в зависимости от вашей системы:

$ /sbin/ifconfig | sed -n '2 p' | awk '' 

Я тоже боролся с этим, пока не нашел простую команду для этой цели

man hostname рекомендует использовать --all-ip-addresses флаг (сокращение -I ), вместо -i , так как -i работает, только если имя хоста может быть разрешено. Итак, вот оно:

И если вас интересует только основной, cut Это:

ip это правильный инструмент для использования в качестве ifconfig в течение некоторого времени устарела. Вот команда awk/sed/grep-free, которая значительно быстрее, чем любая другая, опубликованная здесь!:

ip=$(ip -f inet -o addr show eth0|cut -d\ -f 7 | cut -d/ -f 1) 

(да, это пробел после первого -d )

Команда ifdata (находится в пакете moreutils) предоставляет интерфейс для простого извлечения данных ifconfig без необходимости анализа выходных данных из ifconfig вручную. Это достигается с помощью одной команды:

куда eth1 это имя вашего сетевого интерфейса.

Я не знаю, как этот пакет ведет себя, если ifconfig не установлен. Как Syncrho заявил в своем ответе, ifconfig уже давно устарел и больше не встречается во многих современных дистрибутивах.

Вот лучший способ получить IP-адрес устройства в переменную:

ip=$(ip route get 8.8.8.8 | awk 'NR==1 ') 

NB Обновление для поддержки новой версии Linux. (работает также со старшими)

ip=$(ip route get 8.8.8.8 | awk -F"src " 'NR==1') 
  1. Hostname -I несколько раз получаю только IP или как на моем VPS он попадает 127.0.0.2 143.127.52.130 2a00:dee0:ed3:83:245:70:fc12:d196
  2. Hostnmae -I не работает на всю систему.
  3. С помощью ifconfig может не всегда давать IP, который вам нравится.
    а. Это не удастся, у вас есть несколько интерфейсов (Wi-Fi/ Etcernet) и т. Д.
    б. Основной IP не может быть на первом найденном интерфейсе
  4. Розыск eth0 может произойти сбой, если интерфейс имеет другое имя, как в VPS сервер или wifi ip route get 8.8.8.8

Пытается получить маршрут и интерфейс к DNS-серверу Googles (не открывает ни одного сеанса)
Тогда легко получить ip или имя интерфейса, если хотите.

Это также может быть использовано для получения ip адрес интерфейса к хосту в мультирутированной сети

Моя короткая версия. Полезно, когда у вас есть несколько интерфейсов и просто хотите основной IP.

Не совсем короче или проще, но у меня это работает:

ip=$(ip addr show eth0 | grep -o 'inet 4\+\.3\+\.7\+\.3\+' | grep -o 9.*) 

Вы можете получить только awk, чтобы выполнить весь анализ ifconfig:

ip=$(ifconfig | gawk ' /^[a-z]/ interface == "eth0" && match($0, /^.*inet addr:([.0-9]+)/, a) < print a[1] exit >') 

Следующее работает в Mac OS (где нет параметров ip commnand или hostname):

#!/bin/bash #get interface used for defalt route (usually en0) IF=$(route get default |grep 'interface' |awk -F: ''); #get the IP address for inteface IF #does ifconfig, greps for interface plus 5 lines, greps for line with 'inet ' IP=$(ifconfig |grep -A5 $IF | grep 'inet ' | cut -d: -f2 |awk ''); #get the gateway for the default route GW=$(route get default | awk '/gateway:/ '); 

При использовании grep для извлечения части строки (как это делают некоторые другие ответы), утверждения Perl для просмотра вперед и назад являются вашими друзьями.

Пример вывода ifconfig:

eth0 Link encap:Ethernet HWaddr d0:67:e5:3f:b7:d3 inet addr:10.0.0.114 Bcast:10.0.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1392392 errors:0 dropped:0 overruns:0 frame:0 TX packets:1197193 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1294730881 (1.2 GB) TX bytes:167208753 (167.2 MB) Interrupt:18 

Это извлечет ваш IP-адрес из вывода ifconfig:

Чтобы назначить это переменной, используйте это:

Немного более глубокое объяснение:

-o Выведите только совпадающие (непустые) части совпадающих строк, причем каждая такая часть находится на отдельной выходной строке.

-P Интерпретировать шаблон как регулярное выражение Perl. Это очень экспериментально, и "grep -P" может предупредить о невыполненных функциях.

(?=pattern) это положительное прогнозное утверждение

-o Говорит grep, чтобы возвращать только ту часть строки, которая соответствует шаблону. Предварительный просмотр / упущения не рассматриваются grep как часть возвращаемого шаблона. ? после .* важно, так как мы хотим, чтобы он смотрел на следующий прогноз после совпадения с шаблоном.*, а не на поиск последнего прогнозного матча. (Это не нужно, если мы добавили регулярное выражение для IP-адреса вместо.*, Но читаемость).

В моем скрипте мне нужна была только сетевая часть IP, поэтому я сделал это так

local=$(hostname -I | awk '' | cut -f1,2,3 -d".") 

Где вырезать -f1,2,3 -d"." может быть прочитано как "получить первые 3 части, разделенные запятыми". Чтобы изменить интерфейсы, просто измените $2 на номер вашего интерфейса, чтобы получить полный IP-адрес.

Я думаю, что самый надежный ответ:

ifconfig | grep 'inet addr:' | grep -v '127.0.0.1' | awk -F: '' | awk '' | head -1 

потому что, когда вы не используете head -1 показывает все ips.

IFACE='eth0' IP=$(ip -4 address show $IFACE | grep 'inet' | sed 's/.*inet \([0-9\.]\+\).*/\1/') 

Преимущество этого способа состоит в том, чтобы указать интерфейс (переменная IFACE в примере) на случай, если вы используете несколько интерфейсов на вашем хосте.

Кроме того, вы можете изменить команду ip, чтобы адаптировать этот фрагмент по вашему усмотрению (IPv6-адрес и т. Д.).

Пытаясь избежать слишком большого количества каналов, работать с различными linux, устанавливать код выхода и избегать ifconfig или других пакетов, я пробовал все это в awk:

 ip addr show | awk ' BEGIN /^1+: eth6+.*UP*/ ss==1 && /^ +inet / END ' 

и обратите внимание, что конкретный интерфейс может быть указан после "ip addr show", если вам не нужен только первый интерфейс eth. А для адаптации к ipv6 нужно искать "inet6" вместо "inet".

В mac osx вы можете использовать ipconfig getifaddr [interface] чтобы получить локальный ip:

$ ipconfig getifaddr en0 192.168.1.30 
$ man ipconfig DESCRIPTION ipconfig is a utility that communicates with the IPConfiguration agent to retrieve and set IP configuration parameters. It should only be used in a test and debug context. Using it for any other purpose is strongly discouraged. Public API's in the SystemConfiguration framework are cur- rently the only supported way to access and control the state of IPCon- figuration. . getifaddr interface-name Prints to standard output the IP address for the first net- work service associated with the given interface. The output will be empty if no service is currently configured or active on the interface. 

В моем случае у меня было несколько интерфейсов в списке ранее eth0 , С помощью этой команды вы можете получить IP-адрес для любого интерфейса. Для этого вам нужно изменить eth0 чтобы интерфейс, который вам нужен.

/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '' 

Если под « мой IP-адрес » вы подразумеваете « IP-адрес, который моя машина будет использовать для доступа к общедоступному Интернету, к которому я подключен », то этот очень аккуратный ответ JSON может сработать для вас, в зависимости от того, какая операционная система работает на вашей машине. :

ip=$( ip -j route get 8.8.8.8 | jq -r '.[].prefsrc' ) 

Для этого требуется команда, которая создает вывод JSON (некоторые говорят, что BusyBox ip команда не может этого сделать), синтаксический анализатор CLI, который может извлекать поля из ввода JSON, и ваша машина должна знать, как получить общедоступный IP-адрес 8.8.8.8.

Если вы хотите, чтобы IP-адрес, который ваша машина использовала для перехода в другое место, например, в локальную сеть, поместите этот другой IP-адрес вместо общедоступного IP-адреса 8.8.8.8, например

ip=$( ip -j route get 192.168.1.1 | jq -r '.[].prefsrc' ) ip=$( ip -j route get 10.1.2.3 | jq -r '.[].prefsrc' ) 

Если у вас есть только один интерфейс, то для получения вашего IP-адреса подойдет любой IP-адрес, не являющийся локальным хостом.

Разбор вывода JSON с помощью jq намного проще, чем все эти сложные примеры с sed , awk , и grep , но в более сложных примерах используются инструменты, присутствующие по умолчанию почти во всех системах Unix/Linux/BSD.

Источник

Читайте также:  Linux uuid что это такое
Оцените статью
Adblock
detector