Dies ist mehr oder weniger eine Folgefrage zu den beiden folgenden:
- Syntaxfehler beim Entfernen doppelter Zeilen über die Datei awk '! X [$ 0] ++'
- awk / nawk Alternative unter SunOs und Linux
Unter Solaris 10 (SunOS 5.10) werden die folgenden Ergebnisse angezeigt:
$ 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
$
/usr/bin/awk
Akzeptiert unter Solaris 10 keine POSIX-Standard-Awk-Syntax wie '!x[$0]++'
, aber /usr/xpg4/bin/awk
. Soweit gut genug.
Unter Solaris 11 gibt es jedoch nur /usr/bin/awk
gerade mit getconf PATH
. Obwohl es dies auch gibt nawk
und oawk
gibt /usr/bin
, wird von Symlinks an keiner Stelle darauf hingewiesen.
Das Wissen, dass Solaris POSIX-zertifiziert ist, hat mich überrascht.
Wie kann ich ein POSIX-kompatibles Awk unter Solaris 11 mit portablem Code erhalten, der auch auf anderen POSIX-kompatiblen Systemen funktioniert? (Oder ist die einzige Option, um zu überprüfen, ob eine dieser vorhanden ist, nawk
oder oawk
eine davon zu verwenden, falls vorhanden?)
Was ist nawk
und oawk
?
/usr/xpg4/bin/awk
ist nicht in Solaris 11?nawk
"Neu istawk
", verbessert ein Unternehmen von AT & Tawk
.Antworten:
Bei einer vollständigen Solaris 11-Installation oder einer Desktop-Solaris 11-Installation stehen drei
awk
Implementierungen sowie einige Varianten zur Verfügung:Sie sind alle "standardkonform", obwohl sie unterschiedlichen Standards entsprechen.
/usr/bin/awk
entspricht derawk
1977 veröffentlichten UNIX- Legacyimplementierung. Es wird zuerst im Standardsystem PATH beibehalten, um vorhandene Skripts nicht zu beschädigen, da nachfolgendeawk
Releases die Kompatibilität beeinträchtigen .oawk
ist auch ein von derawk
/usr/bin/nawk
ist die "neue" Version vonawk
, die 1986 zum ersten Mal in SVR3.1 ausgeliefert wurde. DerAwk
POSIX-Standard basierte auf dieser Implementierung./usr/xpg4/bin/awk
ist fast identisch mit der ersteren, wird jedoch formal anhand der POSIX-Konformitätsvalidierungstests überprüft./usr/gnu/bin/awk
ist auch/usr/bin/gawk
die GNU - Variante vonawk
. Es zielt darauf ab, den meisten oder allen POSIX-Standards zu entsprechen, wenn die UmgebungsvariablePOSIXLY_CORRECT
in der Umgebung festgelegt oder mit der-W posix
Option aufgerufen wird , fügt aber ansonsten zahlreiche spezifische eigene Erweiterungen hinzu.igawk
undpgawk
sind selbst Erweiterungengawk
, die erste unterstützt Include-Dateien und die zweite unterstützt die Profilerstellung.Im Kapitel zur GNU-
awk
Geschichte finden Sie viele nützliche Informationen.Bei
core-os
einer regulären Solaris 11-Installation sind garantiert nur die Pakete vorhanden, also nuroawk/awk
undnawk
dort. Insbesondere wenn Sie eine neue nicht globale Zone erstellen , enthält diese standardmäßig dassolaris-small-server
Gruppenpaket, also weder dasxpg4
diegnu
awk
Binärdateien noch diese verfügbar sind. Dies ist beabsichtigt. Diesolaris-small-server
Gruppe ist ein minimaler Startpunkt, zu dem Sie die erforderlichen Pakete hinzufügen, damit Ihre Anwendungen ordnungsgemäß funktionieren. Dies ist sicherer und effizienter als die vorherige (Solaris 10) Methode, bei der alles, was in der globalen Zone installiert wurde, auch in der nicht globalen Zone installiert wurde. Sie mussten also nicht verwendete Pakete entfernen, um die Zone zu minimieren.Damit POSIX
awk
in einer solchen "kleinen Server" -Installation portabel unterstützt wird, müssen Sie das installierenxcu4
Paket und PATH auf den POSIX-konformen Pfad setzen:Sollten Sie aus irgendeinem Grund nicht wollen , das Paket zu installieren, eine Abhilfe ist es, eine „custom“ zu verwenden ,
PATH
enthältnawk
wieawk
zB:Alternativ können Sie
GNU awk
Ihre installieren und einstellenPATH
, um sie zuerst abzurufen:Beachten Sie, dass dies nicht spezifisch für Solaris 11 ist. A ähnliche Paketgruppierung war bereits in Solaris 10 und früheren Versionen vorhanden, und die POSIX-kompatiblen Dienstprogramme wurden nur in den Metaclustern "Endbenutzer", "Entwickler" und "Vollständige Installation" installiert. Wenn ein System oder eine Zone mit dem Metacluster "Core" oder "Networking Support" installiert wäre, hätte dies zu genau demselben
xpg4
fehlenden Problem geführt.Beachten Sie auch, dass das Fehlen von
/usr/xpg4/bin/awk
in einem Solaris 11-System kein POSIX-Kompatibilitätsfehler ist. Bei den meisten von Oracle und ISVs durchgeführten Tests, einschließlich des Open Group-Zertifizierungsprogramms, werden nur vollständige Solaris-Installationen verwendet . Reduzierte Installationen werden unterstützt aber nicht qualifiziert .Wenn Sie Shell-Skripte (oder Anwendungen, die Shell-Skripte einbetten / Shell-Befehle aufrufen) für Solaris 11 verteilen, müssen Sie nur
/system/xopen/xcu4
eine Abhängigkeit in ihrem IPS- Paket definieren, und das Installationsprogramm führt automatisch die erforderlichen Schritte aus, damit das Skript ordnungsgemäß funktioniert:Siehe https://docs.oracle.com/cd/E53394_01/html/E54820/dependtypes.html
quelle
awk
auf einem Solaris-System oder einer nicht globalen Zone immer vorhanden, sodass es nicht um die Verfügbarkeit, sondern um den Namen des Befehls (nawk
vsawk
) geht. docs.oracle.com/cd/E53394_01/html/E54763/nawk-1.htmlnawk
ist fast POSIX (es unterstütztCONVFMT
zum Beispiel nicht), aber ja, zumindest ist das nicht so schlimm wiegrep
(das hat nicht das POSIX-e
/-E
zum Beispiel) odertr
(das hat nichttr a-f A-F
).