Wenn Sie wirklich verwenden gawk
(obwohl Sie möglicherweise verwenden nawk
oder mawk
in 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 filefuncs
Erweiterung 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 gawk
Binä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: gawk
Kommt auch mit einer kleinen Bibliotheksfunktion zum Lesen der passwd
Datei, können Sie sie wie folgt aufrufen:
gawk -i passwd.awk -- 'BEGIN { while(uu=getpwent()) {print uu;} endpwent(); }'
Ich bevorzuge die Verwendung getent
auf Linux / glibc-Systemen, da es nsswitch unterstützt.