Esta es más o menos una pregunta de seguimiento a las siguientes dos:
- Error de sintaxis al eliminar líneas duplicadas a través del archivo awk '! X [$ 0] ++'
- Alternativa awk / nawk en SunOs y Linux
Veo que en Solaris 10 (SunOS 5.10), obtengo los siguientes resultados:
$ type -a awk
awk is /usr/bin/awk
$ PATH="$(getconf PATH)" type -a awk
awk is /usr/xpg4/bin/awk
awk is /usr/bin/awk
$
En Solaris 10, /usr/bin/awk
no acepta la sintaxis Awk estándar POSIX como '!x[$0]++'
, pero /usr/xpg4/bin/awk
sí. Lo suficientemente bueno hasta ahora.
Sin embargo, en Solaris 11, solo hay /usr/bin/awk
incluso con getconf PATH
. Aunque también existe nawk
y oawk
existe /usr/bin
, estos evidentemente no son señalados por enlaces simbólicos desde cualquier lugar.
Sabiendo que Solaris tiene certificación POSIX, esto me sorprendió.
¿Cómo puedo obtener un Awk compatible con POSIX de manera estándar en Solaris 11 usando un código portátil que también funcionará en otros sistemas compatibles con POSIX? (¿O es la única opción para verificar la existencia de nawk
o oawk
usar uno de estos si está presente?)
Para el caso, ¿qué son nawk
y oawk
?
/usr/xpg4/bin/awk
no está en Solaris 11?nawk
es "nuevoawk
", un AT&T mejoradoawk
.Respuestas:
En una instalación de Solaris 11 completa o de escritorio, hay tres
awk
implementaciones disponibles, más algunas variantes:Todos son "compatibles con los estándares", aunque cumplen con diferentes estándares.
/usr/bin/awk
está cumpliendo con laawk
implementación heredada de UNIX lanzada en 1977. Se mantiene primero en la RUTA predeterminada del sistema para no romper los scripts existentes ya que lasawk
versiones posteriores rompen la compatibilidad.oawk
es sinónimo deawk
/usr/bin/nawk
es la "nueva" versión deawk
, enviada por primera vez en SVR3.1 en 1986. ElAwk
estándar POSIX se basó en esta implementación./usr/xpg4/bin/awk
es casi idéntico al anterior, pero el que se verifica formalmente con las pruebas de validación de conformidad POSIX./usr/gnu/bin/awk
, también/usr/bin/gawk
es la variante GNU deawk
. Su objetivo es cumplir con la mayoría o la totalidad del estándar POSIX cuando la variable de entornoPOSIXLY_CORRECT
se establece en el entorno o cuando se llama con la-W posix
opción, pero de lo contrario agrega numerosas extensiones propias específicas.igawk
ypgawk
son extensiones en sí mismasgawk
, la primera admite incluir archivos y la segunda admite la creación de perfiles.Consulte también el capítulo de historia de GNU
awk
para obtener mucha información útil.Sólo los
core-os
paquetes están garantizados para estar presentes en una instalación normal de Solaris 11, por lo tanto sólooawk/awk
ynawk
están ahí. En particular, cuando crea una nueva zona no global , contiene de manera predeterminada elsolaris-small-server
paquete de grupo, de modo quexpg4
ni elgnu
awk
binario ni el otro están disponibles. Esto es por diseño. Elsolaris-small-server
grupo es un punto de inicio mínimo al que agrega los paquetes necesarios para que sus aplicaciones funcionen correctamente. Esto es más seguro y eficiente que la forma anterior (Solaris 10) donde todo lo instalado en la zona global también se instaló en la no global, por lo que tuvo que eliminar los paquetes no utilizados cuando quería minimizar la zona.Para conseguir que POSIX
awk
admita una instalación portátil en una instalación de "servidor pequeño" de este tipo, debe instalar elxcu4
paquete y configurar su RUTA en el que cumple con POSIX:Si por alguna razón no desea instalar ese paquete, una solución alternativa es usar un "personalizado" que
PATH
contenganawk
comoawk
, por ejemplo:Alternativamente, puede instalarlo
GNU awk
y configurarloPATH
para obtenerlo primero:Tenga en cuenta que esto no es específico de Solaris 11. Ya existía una agrupación de paquetes similar en Solaris 10 y anteriores, y las utilidades compatibles con POSIX solo se instalaron en los metaclusters "Usuario final", "Desarrollador" y "Instalación completa". Tener un sistema o una zona instalados con el metacluster "Core" o "Networking support" habría llevado al mismo
xpg4
problema que falta.Tenga en cuenta también que la falta de
/usr/xpg4/bin/awk
un sistema Solaris 11 no es una falla de cumplimiento POSIX. Solo se utilizan instalaciones completas de Solaris en la gran mayoría de las pruebas realizadas por Oracle e ISV, incluido el programa de certificación Open Group . Las instalaciones reducidas son compatibles pero no están calificadas .Si distribuye scripts de shell (o aplicaciones que incorporan scripts de shell / invocando comandos de shell) para Solaris 11, solo necesita definirlo
/system/xopen/xcu4
como una dependencia en su paquete IPS y el instalador hará automáticamente lo que se requiere para que el script funcione correctamente:Ver https://docs.oracle.com/cd/E53394_01/html/E54820/dependtypes.html
fuente
awk
siempre está presente en un sistema Solaris o en una zona no global, por lo que el problema no se trata de disponibilidad sino que se limita al nombre del comando (nawk
vsawk
). docs.oracle.com/cd/E53394_01/html/E54763/nawk-1.htmlnawk
es casi POSIX (no es compatible,CONVFMT
por ejemplo), pero sí, al menos eso no es tan malo comogrep
(que no tiene POSIX-e
/-E
por ejemplo) otr
(que no tienetr a-f A-F
).