実際に使用している場合gawk
(ただし、、nawk
またはを使用mawk
している場合がありますが、この場合は適用されません)、v4.0以降で使用可能なロード可能な拡張機能の 1つを使用してネイティブに実行できます。私は使用しています(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)
この拡張機能の詳細については、manページを参照してください。
次のようなもので実行します:
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
nsswitchをサポートしているので、Linux / glibcシステムで使用することを好みます。