This is more or less a follow up question to the following two:
- Syntax error removing duplicate lines via awk '!x[$0]++' file
- awk/nawk alternative on SunOs and Linux
I see that on Solaris 10 (SunOS 5.10), I get the following results:
$ 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
$
On Solaris 10, /usr/bin/awk
does not accept POSIX standard Awk syntax such as '!x[$0]++'
, but /usr/xpg4/bin/awk
does. Good enough so far.
However, on Solaris 11, there is only /usr/bin/awk
even with getconf PATH
. Although there is also nawk
and oawk
is /usr/bin
, these evidently aren't pointed to by symlinks from anywhere.
Knowing that Solaris is POSIX certified, this surprised me.
How can I get a POSIX compliant Awk standardly on Solaris 11 using portable code that will also work on other POSIX-compliant systems? (Or is the only option to check for the existence of nawk
or oawk
and use one of these if present?)
For that matter, what are nawk
and oawk
?
Best Answer
On a full or desktop Solaris 11 installation, there are three
awk
implementations available, plus some variants:They are all "standard compliant", albeit complying with different standards.
/usr/bin/awk
is complying with the legacy UNIXawk
implementation released in 1977. It is kept first in the default system PATH not to break existing scripts as subsequentawk
releases break compatibility.oawk
is a synonymous of theawk
/usr/bin/nawk
is the "new" version ofawk
, first shipped in SVR3.1 in 1986.Awk
POSIX standard was based on this implementation./usr/xpg4/bin/awk
is almost identical to the former, but the one that is formally checked against POSIX conformance validation tests./usr/gnu/bin/awk
, also/usr/bin/gawk
is the GNU variant ofawk
. It aims to comply with most or all of the POSIX standard when the environment variablePOSIXLY_CORRECT
is set in the environment or when called with the-W posix
option but otherwise adds numerous specific own extensions.igawk
andpgawk
are themselves extensions togawk
, the first one supports include files and the second one supports profiling.See also the GNU
awk
history chapter for a lot of useful information.Only the
core-os
packages are guaranteed to be present on a Solaris 11 regular installation, thus onlyoawk/awk
andnawk
are there. In particular, when you create a new non global zone, it contains by default thesolaris-small-server
group package so neither thexpg4
nor thegnu
awk
binaries are available. This is by design. Thesolaris-small-server
group is a minimal start point to which you add the required packages for your applications to properly work. This is more secure and efficient than the previous (Solaris 10) way where everything installed on the global zone was installed on the non global one too so you had to remove unused packages when you wanted to minimize the zone.To get POSIX
awk
support a portable way in such a "small server" installation, you need to install thexcu4
package and set you PATH to the POSIX conformant one:Should for some reason you don't want to install that package, a workaround is to use a "custom"
PATH
containingnawk
asawk
, e.g.:Alternatively, you might install
GNU awk
and set yourPATH
to get it first:Note that this is not specific to Solaris 11. A similar package grouping was already existing under Solaris 10 and earlier and the POSIX compliant utilities were only installed in the "End User", "Developer" and "Full install" metaclusters. Having a system or a zone installed with the "Core" or "Networking support" metacluster would then have lead to the very same
xpg4
missing issue.Note also that the lack of
/usr/xpg4/bin/awk
in a Solaris 11 system is not a POSIX compliance failure. Only full Solaris installations are used in the vast majority of tests performed by Oracle and ISVs, including the Open Group certification program. Reduced installations are supported but not qualified.Should you distribute shell scripts (or applications embedding shell scripts/calling shell commands) for Solaris 11, you just need to define
/system/xopen/xcu4
as a dependency in their IPS package and the installer will automatically do what is required for the script to work properly:See https://docs.oracle.com/cd/E53394_01/html/E54820/dependtypes.html