Si vous utilisez vraiment gawk(bien que vous puissiez utiliser nawk, ou mawk, dans ce cas, cela ne s'applique pas), vous pouvez le faire de manière native en utilisant l'une des extensions chargeables disponibles depuis la v4.0. J'utilise gawk-4.1.x(v4.0 avait une variation sur la syntaxe de chargement des extensions).
Le chargement de l' filefuncsextension ajoute (entre autres) une stat()fonction:
@load "filefuncs"
BEGIN {FS=":"}
(NF==7) {
printf("user: %s %i %i\n",$1,$3,$4)
rc=stat($6,fstat)
err=ERRNO # ERRNO is a string, not an int!
if (rc<0) {
printf(" error: %s rc=%i %s\n",$6,rc,err)
} else {
if (fstat["type"]!="directory")
printf(" ENOTDIR: %s %s\n",$6,fstat["type"])
if (fstat["uid"]!=$3)
printf(" uid mismatch: %s %i!=%i\n",$6,fstat["uid"],$3)
if (fstat["gid"]!=$4)
printf(" gid mismatch: %s %i!=%i\n",$6,fstat["gid"],$4)
}
}
Consultez la filefuncs(3am)page de manuel pour plus de détails sur cette extension.
Courez avec quelque chose comme:
gawk -f testhome.awk <(getent passwd) # bash/zsh and glibc
gawk -f testhome.awk /etc/passwd
Vous pouvez confirmer que votre gawkbinaire prend en charge les extensions avec:
BEGIN {
if (!("api_major" in PROCINFO))
printf("No extension API.\n")
else
printf("Extension API v%s.%s.\n",PROCINFO["api_major"],PROCINFO["api_minor"])
}
À part: gawkest également livré avec une petite fonction de bibliothèque pour lire le passwdfichier, vous pouvez l'invoquer comme:
gawk -i passwd.awk -- 'BEGIN { while(uu=getpwent()) {print uu;} endpwent(); }'
Je préfère utiliser getentsur les systèmes Linux / glibc car il prend en charge nsswitch.