#!/bin/bash
# 2016-04-27 rzm@icm.edu.pl

ip a | awk '{
	if ($0 ~ /^[0-9]/) {
		num=$1; gsub(":$", "", num)
		nums[num] = 1
		if (num > nummax) nummax = num
		dev[num]=$2; gsub(":$", "", dev[num])
		if (length(dev[num]) > devw) devw = length(dev[num])
		flags[num]=$3;
		gsub("BROADCAST", "BC", flags[num])
		gsub("MULTICAST", "MC", flags[num])
		if (length(flags[num]) > flagsw) flagsw = length(flags[num])
		mtu[num]=$5
		if (length(mtu[num]) > mtuw) mtuw = length(mtu[num])
	}
	if ($0 ~ /^    link/) {
		link[num] = $2
		if (length(link[num]) > linkw) linkw = length(link[num])
	}
	if ($0 ~ /^    inet /) {
		inet[num] = inet[num] " " $2
		if (length(inet[num]) > inetw) inetw = length(inet[num])
	}
	if ($0 ~ /^    inet6 / && $2 !~ /^fe80::/) {
		inet6[num] = inet6[num] " " $2
		if (length(inet6[num]) > inet6w) inet6w = length(inet6[num])
	}
} END {
	for (num = 0; num <= nummax; num++)
		if (dev[num] != "") {
			if (link[num] == "") link[num] = " -"
			if (inet[num] == "") inet[num] = " -"
			if (inet6[num] == "") inet6[num] = " -"
			printf "%-*s %-*s %*s %-*s %-*s %-*s\n", devw, dev[num], flagsw, flags[num], mtuw, mtu[num], linkw, link[num], inetw, inet[num], inet6w, inet6[num]
		}
}'

exit
17: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
    link/ether 00:21:28:45:c0:d3 brd ff:ff:ff:ff:ff:ff
    inet 193.219.28.157/28 brd 193.219.28.159 scope global br1
    inet6 2001:6a0:0:14::2/64 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::221:28ff:fe45:c0d3/64 scope link
       valid_lft forever preferred_lft forever
