Как показать только интерфейсы, начинающиеся с определенного шаблона

В POSIX 7 говорится, что это расширения.

Базовые определения , раздел 2.1.1 Требования:

Система может предоставлять нестандартные расширения. Эти функции, не требуемые POSIX.1-2008, могут включать, но не ограничиваются:

[...]

  • Дополнительные специальные символьные файлы с специальные свойства (например, / dev / stdin , / dev / stdout и / dev / stderr ])

Найдено путем поиска POSIX HTML: Где находится список функций POSIX C API?

Также довольно странно, что инструмент uuencode дает / dev / stdout волшебный эффект :

Указание операнда decode_pathname для / dev / stdout должно указывать, что uudecode должен использовать стандартный вывод.

В документации ядра Linux сказано, что оно должно быть во всех системах.

https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/devices.rst

Compulsory links
These links should exist on all systems:
/dev/fd       /proc/self/fd   symbolic   File descriptors
/dev/stdin    fd/0            symbolic   stdin file descriptor
/dev/stdout   fd/1            symbolic   stdout file descriptor
/dev/stderr   fd/2            symbolic   stderr file descriptor

Однако я не смог найти, где эти символические ссылки создаются в ядре (имеется ли дистрибутив? ).

3
09.02.2018, 14:03
4 ответа

Para su salida actual ifconfig:

ifconfig | grep -A7 --no-group-separator '^s1-eth'
2
27.01.2020, 21:08
 ifconfig | awk '/^s[[:digit:]]+-eth[[:digit:]]+:/ {flag=1} /!^[[:digit:]]+-eth[[:digit:]]+:/ {flag=0}flag'

Usando awk, el patrón coincide con el descrito, configurando un indicador de impresión en 1 si existe y 0 si no. Impresión basada en bandera.

-1
27.01.2020, 21:08

Podría usar grep -Anpara imprimir la línea correspondiente y n las siguientes, pero eso es un poco desordenado ya que el número de líneas puede variar.

Probablemente sea mejor usar awk. Esto imprimiría todas las secciones que comienzan con enp1o enp3. La primera regla !/^ / {p=0}borra la variable psi la línea no comienza con un espacio, la segunda /^enp[13]/ {p=1}establece si la línea comienza con los nombres de interfaz que queremos, y luego imprimimos si pestá establecido. Las líneas que comienzan con espacios solo coinciden con la última regla, por lo que se imprimen en función del valor anterior de p.

# /sbin/ifconfig -a  |awk '!/^ / {p=0} /^enp[13]/ {p=1}; p'
enp1s0    Link encap:Ethernet  HWaddr... 
          inet addr:...
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:135284106 errors:0 dropped:0 overruns:0 frame:0
          TX packets:144695 errors:0 dropped:0 overruns:0 carrier:2
          collisions:0 txqueuelen:1000 
          RX bytes:8292624956 (8.2 GB)  TX bytes:16595674 (16.5 MB)
enp3s0    Link encap:Ethernet  HWaddr...  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

En su caso, por supuesto usaría un patrón como /^s1-eth/.

4
27.01.2020, 21:08
La salida de

ifconfigtiene una línea en blanco entre cada interfaz, lo que la hace perfectamente adecuada para leer y procesar en "modo de párrafo" en un lenguaje de secuencias de comandos como awko perl. Un "párrafo" es cualquier bloque de texto separado de otros bloques por una -o -líneas vacías más.

Por ejemplo:

ifconfig | awk -v RS='' '/^s1-eth[12]:/ {print}'

El awkejemplo anterior establece el separador de registros(RS)de awken la cadena vacía, lo que hace que procese párrafos en lugar de líneas individuales. En este caso, cada párrafo se prueba para una coincidencia con ^s1-eth[12]:y se imprime si coincide.

Ejemplo de salida de mi sistema:

$ ifconfig | awk -v RS='' '/^(ppp0|lo):/ {print}'
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 64237556  bytes 36962222928 (34.4 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 64237556  bytes 36962222928 (34.4 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1412
        inet ip.ip.ip.ip  netmask 255.255.255.255  destination ip.ip.ip.ip
        ppp  txqueuelen 3  (Point-to-Point Protocol)
        RX packets 28220997  bytes 19305565357 (17.9 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 21719890  bytes 3009382446 (2.8 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Tenga en cuenta que esto ya no se imprime en los párrafos -no hay una línea vacía entre cada "registro" de interfaz. Si desea párrafos en su salida, establezca el separador de registros de salida(ORS)en dos nuevas líneas(\n\n). p.ej.

ifconfig | awk -v RS='' -v ORS='\n\n' '/^(ppp0|lo):/ {print}'

Hacer algo similar con la salida de ipen lugar de la de ifconfiges un poco más complicado. ipno produce una salida claramente separada por párrafos -. Sin embargo, genera cada interfaz en un bloque con el número de la interfaz seguido de dos puntos y un espacio al comienzo de una línea, con el resto de los detalles de esa interfaz a continuación.

Para hacer uso de esto, establezca RS en la expresión regular((^|\n)[0-9]+:). Eso coincide con cualquier dígito seguido de dos puntos y un espacio([0-9]+:)que son o al comienzo del archivo (^, para coincidir con el primer registro, que de otro modo se omitiría )o inmediatamente después una nueva línea.

Por ejemplo, en mi sistema:

$ ip addr | awk -v RS='(^|\n)[0-9]+: ' '/^(lo|eth0):/ {print}'
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
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 01:33:ed:b0:13:a9 brd ff:ff:ff:ff:ff:ff

(mi eth0no tiene ninguna dirección IP porque lo configuré como un puente para máquinas virtuales y contenedores acoplables. Las direcciones IP están en la interfaz br0en lugar de)

7
27.01.2020, 21:08

Теги

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