Jika Anda benar-benar menggunakan gawk(meskipun Anda mungkin menggunakan nawk, atau mawk, dalam hal ini tidak akan berlaku), Anda dapat melakukan ini native menggunakan salah satu ekstensi loadable tersedia sejak v4.0. Saya menggunakan gawk-4.1.x(v4.0 memiliki variasi pada sintaks untuk memuat ekstensi).
Memuat filefuncsekstensi menambahkan (antara lain) stat()fungsi:
@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)
}
}
Lihat filefuncs(3am)halaman manual untuk detail tentang ekstensi ini.
Jalankan dengan sesuatu seperti:
gawk -f testhome.awk <(getent passwd) # bash/zsh and glibc
gawk -f testhome.awk /etc/passwd
Anda dapat mengonfirmasi bahwa gawkbiner Anda mendukung ekstensi dengan:
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"])
}
Selain: gawkjuga dilengkapi dengan fungsi perpustakaan kecil untuk membaca passwdfile, Anda dapat memanggilnya seperti:
gawk -i passwd.awk -- 'BEGIN { while(uu=getpwent()) {print uu;} endpwent(); }'
Saya lebih suka menggunakan getentsistem Linux / glibc karena mendukung nsswitch.