красивый табличный вывод команды ip a (bash script)

я тут поигрался с командой вывода инфы адресов и интерфейсов

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

я в этих ваших башах ничего не понимаю, поэтому если тут есть спецы - допишите

он еще стал использовать printf, но там что-то какие-то ошибки лезут

root@docker:~# source ./.bashrc Интерфейс Статус IP-адреса MAC -bash: printf: --: invalid option printf: usage: printf [-v var] format [arguments] -bash: ./.bashrc: line 25: syntax error near unexpected token (' -bash: ./.bashrc: line 25: ipa() {'

даю рабочий код без принтф

alias ipa='
# Заголовок
echo -e "\033[1;36mИнтерфейс    \033[1;37mСтатус   \033[1;32mIP-адреса                  \033[1;33mMAC\033[0m"
echo "-----------------------------------------------------------------------"
ip -br a | grep -v "^lo" | while read -r iface state rest; do
    # Собираем все IP-адреса (игнорируем metric)
    ips=$(echo "$rest" | grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/[0-9]+" | tr "\n" "," | sed "s/,$//")
    # Получаем MAC
    mac=$(ip -br link | grep -w "$iface" | awk "{print \$3}")
    # Цвет для статуса: UP зеленый, DOWN красный
    if [ "$state" = "UP" ]; then
        color_state="\033[1;32m$state\033[0m"
    else
        color_state="\033[1;31m$state\033[0m"
    fi
    # Используем табуляции для точного выравнивания колонок
    printf "\033[1;36m%s\033[0m\t%-6b\t\033[1;32m%-25s\033[0m\t\033[1;33m%s\033[0m\n" "$iface" "$color_state" "$ips" "$mac"
done'

может быть можно взять вывод в формате json и написать как-то более цивильней?

да, чатик же мне говорил про jq в самом начале, а я его не понял и подумал, что это jquery

а при чем тут баш и яваскрипт?

оказалось, что это не яваскрипт, просто прога так называется для обработки джейсонов в баше

sudo apt install jq

если использовать ip json формат, то можно примерно так реализовать:

ipa_format() {
  awk -F ',' -v OFS=, \
    -v CW=$'\033[1;37m' \
    -v CG=$'\033[1;32m' \
    -v CR=$'\033[1;31m' \
    -v CC=$'\033[1;36m' \
    -v CY=$'\033[1;33m' \
    -v CL=$'\033[m' \
    '{
      split($3, a, ";")
	  status=CW $2 CL
	  if (index(";" $2 ";", ";UP;")) status=CG "UP" CL
	  if (index(";" $2 ";", ";DOWN;")) status=CR "DOWN" CL
      print CC $1 CL, status, CG a[1] CL, CY $4 CL
      for (i=2; i<=length(a); i++) print "", "", CG a[i] CL
    }'
}

ipa() {
  {
    echo 'Интерфейс,Статус,IP-адреса,MAC'
    ip -j addr | jq -r '.[]|[ .ifname, ([.operstate]+.flags|join(";")), ([.addr_info.[]|(.local+"/"+(.prefixlen|tostring))]|join(";")), .address ]|join(",")'
  } | ipa_format \
    | column -ts, \
	| sed '2i ------------------------------------------------------------------'
}

ipa

ага, я думал дать чатику написать из джейсона, но уже токены кончились и я забыл

надо туда еще шлюз добавить и впн маршруты