В 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
Однако я не смог найти, где эти символические ссылки создаются в ядре (имеется ли дистрибутив? ).
Para su salida actual ifconfig
:
ifconfig | grep -A7 --no-group-separator '^s1-eth'
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.
Podría usar grep -An
para 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 enp1
o enp3
. La primera regla !/^ / {p=0}
borra la variable p
si 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 p
está 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/
.
ifconfig
tiene 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 awk
o 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 awk
ejemplo anterior establece el separador de registros(RS
)de awk
en 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 ip
en lugar de la de ifconfig
es un poco más complicado. ip
no 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 eth0
no 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 br0
en lugar de)