Я обновлял свой файл оболочки и думал, что было бы неплохо иметь псевдоним, показывающий только мой ip. Я обычно соединяюсь с Wi-Fi, который находится на wlan0, и это последний "блок" устройств.

Итак, у меня есть что-то вроде этого:

wlan0     Link encap:Ethernet  HWaddr 6c:71:d9:d3:28:9d  
          inet addr:192.168.1.16  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::6e71:d9ff:fed3:289d/64 Scope:Link

И я хочу мой адрес Bcast.

С помощью этой команды я могу получить это:

alias ip="ifconfig | grep Bcast | tail -n1 | cut -d' ' -f14 | cut -d':' -f2"

Но мне это не нравится. Есть ли более чистый способ сделать это?

1 ответ1

1

Если вы уверены, что wlan0 является интерфейсом, вы можете вернуть информацию только для этого интерфейса с помощью:

ifconfig wlan0

Теперь, когда у вас есть только одна строка с Bcast: в ней (исключая tail) вы можете использовать sed для объединения функций grep и cut :

ifconfig wlan0 | sed -n 's/^.*Bcast:\(.*\) .*$/\1/p'

В этом случае sed -n исключает обычную печать строк из ввода, и строка поиска совпадает со всей строкой, отмечая то, что находится между Bcast: и следующим пробелом: подстановка является только этим отмеченным полем, а /p переопределяет -n и заставляет печатать. Обратите внимание, что для назначения этой строки псевдониму вам нужно будет использовать двойные кавычки и экранировать некоторые символы с обратной косой чертой или использовать одинарные кавычки, заменив те, что в приведенной выше команде на '\'' (хотя вы можете опустить результирующий окончательный '').

Наконец, если вы хотите убедиться, что wlan0 - это нужный вам интерфейс, а другие не настроены для доступа в интернет, вы можете узнать, какой интерфейс используется (вам может потребоваться установить networkctl):

networkctl status | sed -n 's/^.*Gateway: .* on \(.*$\)/\1/p'

Это использует sed в выводе networkctl аналогично предыдущему . Теперь вы можете объединить их:

ifconfig $(networkctl status |\
  sed -n 's/^.*Gateway: .* on \(.*$\)/\1/p')|sed -n 's/^.*Bcast:\(.*\) .*$/\1/p'

Это вряд ли аккуратно, но оно охватывает большую часть баз - в частности, если ваша беспроводная сеть не работает, а вы используете вместо нее Ethernet, она все равно должна работать. Если у вас оба интерфейса работают вместе, это еще более усложняется: я оставлю вас работать над этим (подсказка: вам нужно использовать /Gateway/,$ в качестве диапазона строк для команды s и способ исключить записи IPv6).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .