Страница справочника, к которой Вы обращаетесь, прибывает из procps версии вершины.
Но Вы находитесь во встроенной системе, таким образом, у Вас есть busybox версия вершины.
Похоже, что busybox вершина вычисляет %MEM
как VSZ
/MemTotal
вместо RSS
/MemTotal
.
Последняя версия вызовов busybox тот столбец %VSZ
избегать некоторого беспорядка. журнал фиксации
Для получения полного описания всех активных служб попробуйте:
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
но с остальными то же, но я не протестировал это.
Если Вы только хотите распечатать “запись”, если она содержит 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
$ ifconfig | grep "inet addr:" | grep -v 127.0.0.1 | sed -e 's/Bcast//' | cut -d: -f2
Как это работает:
Читая Ваши комментарии и вопрос, кажется, что Вы на самом деле хотите просто получить интерфейсы, которым присвоили 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 могло бы получить Вас точно, в чем Вы нуждаетесь.
Далее будут распечатаны только те интерфейсы, для которых настроен IP.
ifconfig | grep "inet.*broadcast"
ifconfig en0 | grep status
Это покажет статус соединения Ethernet en0
Если вы не против некоторых сценариев bash, вы можете сделать это:
for i in $(ifconfig -lu); do if ifconfig $i | grep -q "status: active" ; then echo $i; fi; done
Это список активных сетевых интерфейсов. Протестировано на Mac OS X 10.13.
Приятно то, что вам не нужно ничего устанавливать. Просто запустите вышеуказанное в терминале.
Получить АКТИВНЫЙ только MAC-адрес интерфейса:
cat /sys/class/net/$(ip addr | awk '/state UP/ {print $2}' | sed 's/.$//')/address
Хотелось бы, чтобы вопрос был немного яснее. Предполагая, что под 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
Мне пришлось сделать это недавно, когда не было известно, будет ли работать eth0 или eth1, но в системе нет pcregrep
.
Вот мое решение:
for interface in /sys/class/net/*; do [ `cat $interface/operstate` == "up" ] && ifconfig `basename $interface`; done
operstate
проверяется первым, и если он соответствует up
, запускаем на нем ifconfig
.