Nếu bạn đang thực sự sử dụng gawk
(mặc dù bạn có thể đang sử dụng nawk
hoặc mawk
trong trường hợp này sẽ không áp dụng), bạn có thể thực hiện việc này một cách tự nhiên bằng cách sử dụng một trong các tiện ích mở rộng có thể tải được kể từ phiên bản 4.0. Tôi đang sử dụng gawk-4.1.x
(v4.0 có một biến thể về cú pháp để tải tiện ích mở rộng).
Tải filefuncs
tiện ích mở rộng thêm (trong số những người khác) một stat()
chức năng:
@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)
}
}
Xem filefuncs(3am)
trang người đàn ông để biết chi tiết về phần mở rộng này.
Chạy với một cái gì đó như:
gawk -f testhome.awk <(getent passwd) # bash/zsh and glibc
gawk -f testhome.awk /etc/passwd
Bạn có thể xác nhận rằng gawk
nhị phân của bạn hỗ trợ các tiện ích mở rộng với:
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"])
}
Ngoài ra: gawk
cũng đi kèm với một chức năng thư viện nhỏ để đọc passwd
tệp, bạn có thể gọi nó như sau:
gawk -i passwd.awk -- 'BEGIN { while(uu=getpwent()) {print uu;} endpwent(); }'
Tôi thích sử dụng getent
trên các hệ thống Linux / glibc vì nó hỗ trợ nsswitch.