Wenn Sie wirklich verwenden gawk(obwohl Sie möglicherweise verwenden nawkoder mawkin diesem Fall nicht zutreffen), können Sie dies nativ mit einer der seit Version 4.0 verfügbaren ladbaren Erweiterungen tun. Ich verwende gawk-4.1.x(v4.0 hatte eine Variation der Syntax zum Laden von Erweiterungen).
Durch das Laden der filefuncsErweiterung wird (unter anderem) eine stat()Funktion hinzugefügt:
@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)
}
}
Weitere filefuncs(3am)Informationen zu dieser Erweiterung finden Sie in der Manpage.
Laufen Sie mit so etwas wie:
gawk -f testhome.awk <(getent passwd) # bash/zsh and glibc
gawk -f testhome.awk /etc/passwd
Sie können bestätigen, dass Ihre gawkBinärdatei Erweiterungen unterstützt, mit:
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"])
}
Nebenbei: gawkKommt auch mit einer kleinen Bibliotheksfunktion zum Lesen der passwdDatei, können Sie sie wie folgt aufrufen:
gawk -i passwd.awk -- 'BEGIN { while(uu=getpwent()) {print uu;} endpwent(); }'
Ich bevorzuge die Verwendung getentauf Linux / glibc-Systemen, da es nsswitch unterstützt.