Il s'agit plus ou moins d'une question complémentaire aux deux suivantes:
- Erreur de syntaxe lors de la suppression des lignes en double via le fichier awk '! X [$ 0] ++'
- alternative awk / nawk sur SunOs et Linux
Je vois que sur Solaris 10 (SunOS 5.10), j'obtiens les résultats suivants:
$ 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
$
Sous Solaris 10, /usr/bin/awk
n'accepte pas la syntaxe Awk standard POSIX telle que '!x[$0]++'
, mais le /usr/xpg4/bin/awk
fait. Assez bien jusqu'à présent.
Cependant, sur Solaris 11, il n'y a /usr/bin/awk
même qu'avec getconf PATH
. Bien qu'il y ait aussi nawk
et oawk
est /usr/bin
, ceux-ci ne sont évidemment pas signalés par des liens symboliques de n'importe où.
Sachant que Solaris est certifié POSIX, cela m'a surpris.
Comment puis-je obtenir un Awk conforme POSIX en standard sur Solaris 11 en utilisant un code portable qui fonctionnera également sur d'autres systèmes conformes POSIX? (Ou est-ce la seule option pour vérifier l'existence de nawk
et oawk
et utiliser l'un d'eux si présent?)
D'ailleurs, quels sont nawk
et oawk
?
/usr/xpg4/bin/awk
n'est pas dans Solaris 11?nawk
est "nouveauawk
", un AT&T amélioréawk
.Réponses:
Sur une installation Solaris 11 complète ou de bureau, trois
awk
implémentations sont disponibles, plus quelques variantes:Ils sont tous "conformes aux normes", bien que conformes à des normes différentes.
/usr/bin/awk
est conforme à l'awk
implémentation UNIX héritée publiée en 1977. Il est conservé en premier dans le système par défaut PATH pour ne pas casser les scripts existants car lesawk
versions suivantes rompent la compatibilité.oawk
est synonyme deawk
/usr/bin/nawk
est la "nouvelle" version deawk
, livrée pour la première fois en SVR3.1 en 1986. LaAwk
norme POSIX était basée sur cette implémentation./usr/xpg4/bin/awk
est presque identique au premier, mais celui qui est formellement vérifié par rapport aux tests de validation de conformité POSIX./usr/gnu/bin/awk
,/usr/bin/gawk
est également la variante GNU deawk
. Il vise à se conformer à la plupart ou à la totalité de la norme POSIX lorsque la variable d'environnementPOSIXLY_CORRECT
est définie dans l'environnement ou lorsqu'elle est appelée avec l'-W posix
option, mais ajoute de nombreuses extensions propres spécifiques.igawk
etpgawk
sont eux-mêmes des extensionsgawk
, le premier prend en charge les fichiers et le second prend en charge le profilage.Voir aussi le chapitre historique GNU
awk
pour de nombreuses informations utiles.Seuls les
core-os
packages sont garantis pour être présents sur une installation régulière de Solaris 11, donc uniquementoawk/awk
etnawk
sont là. En particulier, lorsque vous créez une nouvelle zone non globale , elle contient par défaut lesolaris-small-server
package de groupe, donc ni lexpg4
ni lesgnu
awk
binaires ne sont disponibles. C'est par conception. Lesolaris-small-server
groupe est un point de départ minimal auquel vous ajoutez les packages requis pour que vos applications fonctionnent correctement. C'est plus sûr et plus efficace que la méthode précédente (Solaris 10) où tout installé sur la zone globale était également installé sur la zone non globale, vous avez donc dû supprimer les packages inutilisés lorsque vous vouliez réduire la zone.Pour obtenir la
awk
prise en charge POSIX de manière portable dans une telle installation de "petit serveur", vous devez installer lexcu4
package et définir votre PATH sur celui conforme POSIX:Si pour une raison quelconque vous ne souhaitez pas installer ce package, une solution de contournement consiste à utiliser un "personnalisé"
PATH
contenantnawk
commeawk
, par exemple:Vous pouvez également installer
GNU awk
et configurer votrePATH
pour l'obtenir en premier:Notez que cela n'est pas spécifique à Solaris 11. Un regroupement de packages similaire existait déjà sous Solaris 10 et versions antérieures et les utilitaires compatibles POSIX n'étaient installés que dans les métaclusters "Utilisateur final", "Développeur" et "Installation complète". Le fait d'avoir un système ou une zone installé avec le métacluster «Core» ou «Networking support» aurait alors conduit au même
xpg4
problème manquant.Notez également que l'absence d'
/usr/xpg4/bin/awk
un système Solaris 11 n'est pas un échec de conformité POSIX. Seules les installations complètes de Solaris sont utilisées dans la grande majorité des tests effectués par Oracle et les éditeurs de logiciels indépendants, y compris le programme de certification Open Group . Les installations réduites sont prises en charge mais non qualifiées .Si vous distribuez des scripts shell (ou des applications intégrant des scripts shell / appelant des commandes shell) pour Solaris 11, il vous suffit de définir
/system/xopen/xcu4
une dépendance dans leur package IPS et le programme d'installation fera automatiquement ce qui est requis pour que le script fonctionne correctement:Voir https://docs.oracle.com/cd/E53394_01/html/E54820/dependtypes.html
la source
awk
est toujours présent sur un système Solaris ou une zone non globale donc le problème n'est pas sur la disponibilité mais limité au nom de la commande (nawk
vsawk
). docs.oracle.com/cd/E53394_01/html/E54763/nawk-1.htmlnawk
est presque POSIX (il ne supporte pasCONVFMT
par exemple), mais oui, au moins ce n'est pas aussi mauvais quegrep
(qui n'a pas le POSIX-e
/-E
par exemple) outr
(qui n'en a pastr a-f A-F
).