Как использовать ifconfig для показа активного интерфейса только

Страница справочника, к которой Вы обращаетесь, прибывает из procps версии вершины.

Но Вы находитесь во встроенной системе, таким образом, у Вас есть busybox версия вершины.

Похоже, что busybox вершина вычисляет %MEM как VSZ/MemTotal вместо RSS/MemTotal.

Последняя версия вызовов busybox тот столбец %VSZ избегать некоторого беспорядка. журнал фиксации

22
01.12.2013, 10:25
10 ответов

Для получения полного описания всех активных служб попробуйте:

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active'

Этот простой regex должен отфильтровать только активные интерфейсы и всю их информацию. Я предполагаю, что Вы помещаете псевдоним для этого в Вашем ~/.profile или ~/.bash_profile файл (возможно, ifactive?)

Чтобы просто получить имя интерфейса (полезный для сценариев) используйте:

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active' | egrep -o -m 1 '^[^\t:]+'

Необходимо установить pcregrep для этого для работы. Это находится на macports в pcre пакете. С другой стороны, это должно работать с GNU grep использование grep -Pzo вместо pcregrep -M -o но с остальными то же, но я не протестировал это.

24
27.01.2020, 19:43

Если Вы только хотите распечатать “запись”, если она содержит status: active, затем Вы могли использовать что-то вроде этого awk программа в качестве фильтра к выводу ifconfig:

#!/usr/bin/awk -f
BEGIN            { print_it = 0 }
/status: active/ { print_it = 1 }
/^($|[^\t])/     { if(print_it) print buffer; buffer = $0; print_it = 0 }
/^\t/            { buffer = buffer "\n" $0 }
END              { if(print_it) print buffer }

Когда каждая “запись” запускается (строка пуста или не запускается с Вкладки), начните сохранять запись в буфере. Добавьте к этому буферу любые последующие строки, которые запускаются с Вкладки. Наблюдайте за волшебной строкой status: active; если строка как этот была замечена, распечатайте буфер (предыдущая “запись”), когда новая “запись” запускается (или входные концы).

Сохраните вышеупомянутый текст программы в файле и используйте его как это:

ifconfig -a | awk -f /path/to/file

Или, если Вы chmod +x файл, затем можно упростить его немного:

ifconfig -a | /path/to/file
2
27.01.2020, 19:43
$ ifconfig | grep "inet addr:" | grep -v 127.0.0.1 | sed -e 's/Bcast//' | cut -d: -f2

Как это работает:

  • ifconfig
  • Grep для строк, содержащих "inet addr"
    • Эти строки содержат дюйм/с.
  • Grep для строк, которые не содержат "127.0.0.1"
    • Мы обычно не заботимся о localhost.
    • - v инвертируется grep
  • От остающихся строк удалите "Bcast"
  • Полевое 2 использование сокращения ":" как разделитель
    • Печатает ответ.
-1
27.01.2020, 19:43

Читая Ваши комментарии и вопрос, кажется, что Вы на самом деле хотите просто получить интерфейсы, которым присвоили IP-адрес им.

Можно сделать это быстро с ifconfig и grep.

Выполнение команды:

ifconfig | grep 'Link\|inet'

Должен произвести что-то подобное:

eth0      Link encap:Ethernet  HWaddr 00:11:22:33:44:55
eth1      Link encap:Ethernet  HWaddr 00:11:22:33:44:66  
          inet addr:192.168.0.8  Bcast:192.168.0.255  Mask:255.255.255.0
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0

Это показало бы каждую строку с именем интерфейса и и IP, если бы у них был тот.

Некоторое более определенное волшебство REGEX могло бы получить Вас точно, в чем Вы нуждаетесь.

1
27.01.2020, 19:43
  • 1
    Спасибо, но где active соображение? –  qweruiop 01.12.2013, 17:22
  • 2
    , если существует строка после интерфейса, то этому присвоили IP-адрес ему, и тем, что я собираю Вас, означает, это составило бы как 'активное'. –  Nathan McCoy 27.12.2013, 19:14

Далее будут распечатаны только те интерфейсы, для которых настроен IP.

ifconfig | grep "inet.*broadcast"
0
27.01.2020, 19:43
ifconfig en0 | grep status

Это покажет статус соединения Ethernet en0

-1
27.01.2020, 19:43

Если вы не против некоторых сценариев bash, вы можете сделать это:

for i in $(ifconfig -lu); do if ifconfig $i | grep -q "status: active" ; then echo $i; fi; done

Это список активных сетевых интерфейсов. Протестировано на Mac OS X 10.13.

Приятно то, что вам не нужно ничего устанавливать. Просто запустите вышеуказанное в терминале.

3
27.01.2020, 19:43

Получить АКТИВНЫЙ только MAC-адрес интерфейса:

cat /sys/class/net/$(ip addr | awk '/state UP/ {print $2}' | sed 's/.$//')/address
0
27.01.2020, 19:43

Хотелось бы, чтобы вопрос был немного яснее. Предполагая, что под Active interface onlyвы имели в виду показывать только имена активных интерфейсов (В моем случае UPи RUNNINGстатусactive)без каких-либо других подробностей. Тогда попробуйте это:

ifconfig | \
  grep "UP\|RUNNIG" \
  | awk '{print $1}' \
  | grep ':' \
  | tr -d ':' \
  | grep -v lo

Вывод будет выглядеть так::

en0
en1
en2
bridge0
p2p0
awdl0
llw0
utun0
utun1
utun2
utun3
en6

Настройте поле grep -vи добавьте дополнительные нежелательные интерфейсы, такие какloopback--> loи т. д., если это необходимо.

Теперь, если вы хотите, вам необходимо проверить, активны ли найденные интерфейсы в настоящее время. Затем мы можем просто передать их в качестве аргумента для ifconfig <interface>, как показано ниже:

[[ $(ifconfig en0 | grep -w active) ]] && echo "en0 is active"

Дальнейшее упрощение и реализация в функции:

checkActiveInterfaces()
{
  local intARR=( $(ifconfig | \
      grep "UP\|RUNNIG" \
      | awk '{print $1}' \
      | grep ':' \
      | tr -d ':' \
      | grep -v lo) );
    intARR=( $(printf "%s\n" "${intARR[@]}" | sort -u) );
    for i in "${intARR[@]}"; do
      [[ $(ifconfig $i | grep -w active) ]] && {
       echo "$i"
    }
    done
}

Выполнение этой функции возвращает только активные интерфейсы. В моем случае:

awdl0
en0
llw0
1
27.01.2020, 19:43

Мне пришлось сделать это недавно, когда не было известно, будет ли работать eth0 или eth1, но в системе нет pcregrep.

Вот мое решение:

for interface in /sys/class/net/*; do [ `cat $interface/operstate` == "up" ] && ifconfig `basename $interface`; done

operstateпроверяется первым, и если он соответствует up, запускаем на нем ifconfig.

1
20.04.2020, 17:01

Теги

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