如果您确实在使用gawk
(尽管可能使用nawk
或mawk
,在这种情况下将不适用),则可以使用v4.0以后可用的可加载扩展之一来原生地执行此操作。我正在使用(v4.0在加载扩展的语法上有所变化)。gawk-4.1.x
加载filefuncs
扩展会添加(以及其他)stat()
功能:
@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)
}
}
有关filefuncs(3am)
此扩展的详细信息,请参见手册页。
运行类似:
gawk -f testhome.awk <(getent passwd) # bash/zsh and glibc
gawk -f testhome.awk /etc/passwd
您可以通过以下方式确认您的gawk
二进制文件支持扩展:
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"])
}
另外:gawk
还带有一个小的库函数来读取passwd
文件,您可以像这样调用它:
gawk -i passwd.awk -- 'BEGIN { while(uu=getpwent()) {print uu;} endpwent(); }'
我更喜欢getent
在Linux / glibc系统上使用,因为它支持nsswitch。