`ip addr` в одной строке для каждого интерфейса

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

 gsettings set org.gnome.desktop.media-handling automount false

работает так же, как и раньше.
Причина сбоя в этом случае, по всей видимости, была вызвана отсутствием установленных переменных среды, в частности $ DBUS_SESSION_BUS_ADDRESS .
Повторим: команда действительно работает для Ubuntu 16.04, как и 14.04.

4
15.07.2015, 10:58
4 ответа

Более новые версии ipмогут выводить данные в формате JSON с параметром -j, которые затем можно обрабатывать с помощью фильтра, такого как jq. Например, это напечатает адрес IPv4 на интерфейсе eth0:

.
$ ip -j addr show dev eth0 | jq -r '.[0].addr_info | map(select(.family == "inet"))[0].local'
192.168.0.1

Или получить список всех IPv4-адресов на машине, по одному в строке:

ip -j addr show | jq -r 'map(.addr_info) | map(map(select(.family == "inet").local)) | flatten |.[]'
127.0.0.1
192.168.0.1
172.19.0.1
172.17.0.1
172.18.0.1

Удалите select(...), чтобы включить, например, адреса IPv6. Возможны многие другие вариации.

6
27.01.2020, 20:53

Этот gawkскрипт проанализирует ip addr show, чтобы предоставить вам запрошенную информацию. Несколько адресов IPv4 объединяются запятой

.
ip a | awk 'function outline() {if (link>"") {printf "%s %s %s\n", iface, inets, link}} $0 ~ /^[1-9]/ {outline(); iface=substr($2, 1, index($2,":")-1); inets=""; link=""} $1 == "link/ether" {link=$2} $1 == "inet" {inet=substr($2, 1, index($2,"/")-1); if (inets>"") inets=inets ","; inets=inets inet} END {outline()}'

Разделить это, чтобы было читабельнее,

ip addr show |
    awk '
        # Output function to format results (if any)
        function outline() {
            if (link>"") {printf "%s %s %s\n", iface, inets, link}
        }

        # Interface section starts here
        $0 ~ /^[1-9]/ {
            outline();                              # Output anything we previously collected
            iface=substr($2, 1, index($2,":")-1);   # Capture the interface name
            inets="";                               # Reset the list of addresses
            link=""                                 # and MAC too
        }

        # Capture the MAC
        $1 == "link/ether" {
            link=$2                   
        }

        # Capture an IPv4 address. Concatenate to previous with comma
        $1 == "inet" {
            inet=substr($2, 1, index($2,"/")-1);    # Discard /nn subnet mask
            if (inets>"") inets=inets ",";          # Suffix existing list with comma
            inets=inets inet                        # Append this IPv4
        }

        # Input processing has finished
        END {
            outline()                               # Output remaining collection
        }
    '

Пример вывода

eth0 10.0.2.15 08:00:27:0f:db:b3
eth1 192.168.56.101 08:00:27:33:04:26
0
27.01.2020, 20:53

Просто используйте --короткий флаг.

ip --brief address show
15
27.01.2020, 20:53

в дебиане:

man ip
...
       -o, -oneline
              output each record on a single line, replacing line feeds with the '\' character. This is convenient when you want to count records with wc(1) or to grep(1) the output.

EDITED @ 2021.01.06, так как я неправильно понял вопрос ранее.

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

ip addr show|xargs|sed 's/ \([0-9]*: \)/\n\1/g'

Каждая запись для адаптера начинается с [0-9]*: , что может быть для вас разделителем:

root@jprst0202:~# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ip_vti0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
    link/none
    inet 10.7.11.1/24 brd 10.7.11.255 scope global tun0
       valid_lft forever preferred_lft forever
4: tun1: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
    link/none
    inet 10.7.5.1/24 brd 10.7.5.255 scope global tun1
       valid_lft forever preferred_lft forever
...

Так:

  • xargs -поместить все в одну строку
  • sed... -добавляет новую строку перед каждым пробелом , числом(или кратным ), двоеточием и снова пробел узор

Результат:

root@jprst0202:~# ip addr show|xargs|sed 's/ \([0-9]*: \)/\n\1/g'
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever
2: ip_vti0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000 link/ipip 0.0.0.0 brd 0.0.0.0
3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100 link/none inet 10.7.11.1/24 brd 10.7.11.255 scope global tun0 valid_lft forever preferred_lft forever
4: tun1: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100 link/none inet 10.7.5.1/24 brd 10.7.5.255 scope global tun1 valid_lft forever preferred_lft forever
5: tun2: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100 link/none inet 10.7.7.1/24 brd 10.7.7.255 scope global tun2 valid_lft forever preferred_lft forever
...
0
18.11.2020, 11:10

Теги

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