оптимизировать команду с помощью or или pipe для анализа вывода ifconfig

У меня есть эта командная строка, но она удваивает grep и awk

 ifconfig eth1 2> /dev/null | grep "inet " | awk '{gsub("addr:","",$2); print $2 }' || ifconfig eth0 2> /dev/null | grep "inet " | awk '{gsub("addr:","",$2); print $2 }'` 

Я пытаюсь сократить это, делая что-то вроде,

 echo $(ifconfig eth1 2> /dev/null || ifconfig eth0 2> /dev/null) &> grep "inet " | awk '{gsub("addr:","",$2); print $2 }' 

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

4 Solutions collect form web for “оптимизировать команду с помощью or или pipe для анализа вывода ifconfig”

Попробуй это:

 $ ( ifconfig eth2 2>/dev/null || ifconfig eth0 2>/dev/null ) | grep ... 

Он имеет ту же логику, но имеет значение || внутри parens, поэтому он передает только результат успешной команды grep .

Еще один модульный подход: не баш-специфический

 get_ifconfig () { for iface do ifconfig "$iface" 2>/dev/null && return done } get_ifconfig eth1 eth2 eth3 | sed -n 's/.*inet addr:\([0-9.]\+\).*/\1/p' 

Как насчет этого подхода

 $ echo eth1 eth0 | xargs -n 1 ifconfig 2>/dev/null | awk '/inet/{gsub("addr:","",$2);print $2;exit}' 192.168.124.132 $ 

Если вы хотите захватить первый интерфейс с адресом IPv4, вы можете запустить ifconfig только один раз, чтобы отобразить все интерфейсы и извлечь первую запись с адресом IPv4. Вы также можете оптимизировать извлечение, комбинируя то, что вы делаете с grep и awk .

 ifconfig -a | awk '/^[^ ]/ {iface=$1} iface ~ /^eth/ && sub(/inet addr:/,"") {print $1; exit}' 

Новая строка является необязательной, я включил ее для ясности. Это более сложная версия

 ifconfig -a | awk 'sub(/inet addr:/,"") {print $1; exit}' 

который может печатать что-то вроде 127.0.0.1 (из интерфейса loopback), которого вы, по-видимому, не хотите.

Если вы предпочитаете использовать ip , синтаксический анализ примерно одинаково неудобен.

 ip addr | awk '/^[0-9]/ {iface=$2} iface ~ /^eth/ && $1 == "inet" {sub(/\/.*/, "", $2); print $2}' 
  • чтение списка строк из файла, записывающего вывод в утилиту
  • попытка добавить текст до и после некоторого текста
  • Как получить путь, индекс строки и содержимое строки в оболочке bash?
  • команда bash, которая выводит результат предыдущего канала
  • Grep точное количество цифр и некоторые другие символы
  • Найдите строку (например, grep -q) только в одном разделе файла
  • Как удалить все числа, окруженные <>
  • Заменить шаблон в файле с шаблоном во втором файле
  • Как связывать линии между шаблоном начала и конца?
  • bash - извлекает имена файлов из html-файла, содержащего несколько ссылок
  • Преобразование содержимого файла в нижний регистр
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.