下面是我要运行的脚本。无法在awk中使用stat。
cat /etc/passwd | awk 'BEGIN{FS=":"}{print $6 }' | (stat $6 | sed -n '/^Access: (/{s/Access: (\([0-9]\+\).*$/\1/;p}' })'
我想要的输出应该是这样的 /根0550 / bin 0777 /宾0777 我可以使用while或for编写脚本。但是我希望所有脚本都在一行中而没有循环。
答案 0 :(得分:1)
这应该起作用吗?
awk 'BEGIN{FS=":"}{cmd="stat -c\"'%a'\" "$6 ; cmd | getline perm; close(cmd); printf "%s\t%s\n",$6,perm }' /etc/passwd
编辑1: 简要说明:
BEGIN{
FS=":" # set field separator
}
{
cmd="stat -c\"'%a'\" "$6 ; # define stat as a command w/ only perms as output
cmd | getline perm; # capture those perms for the current $6
close(cmd); # close the pipe, good practice to get into
printf "%s\t%s\n",$6,perm # print the directory name and the correlated perms
}
答案 1 :(得分:1)
如果您在perl中完成所有操作,这可能会容易得多/更快:
Application | Account | Application_Date | Case_Exists | Case_Number
1 | 444444 | 10/01/2018 | Y | 2, 3
2 | 444444 | 09/01/2018 | Y | 1, 2, 3
3 | 555555 | 10/01/2018 | N |
优势:
perl -we 'while (@pw = getpwent) { $d = $pw[7]; @st = stat $d or do { warn "$d: $!\n"; next }; printf "%s %s %04o\n", $pw[0], $d, $st[2] & 07777 }'
/etc/passwd
的输出stat
轻松灵活的输出格式答案 2 :(得分:0)
当然$6
并不代表您在awk
之外的想法,您可以代替
$ awk -F: '{print $6}' /etc/passwd | xargs -n1 stat | sed ...
答案 3 :(得分:0)
GNU awk具有示例扩展名filefuncs
,具有stat
功能。以下基于documentation中的示例代码:
$ echo /tmp | awk -F: ' # testing with echo
@load "filefuncs"; # enable extension
{
ret = stat($1,fdata) # stat the file
if (ret < 0) # if file not exists
printf("could not stat %s: %s\n",file, ERRNO) > "/dev/stderr"
printf "%s %o\n",fdata["name"],fdata["mode"] # print name and mode 16 bit
}'
/tmp 41777
如果您想尝试将$1
替换为$6
,并像awk '{...}' /etc/passwd
一样使用它,则可能还需要为扩展名设置shell变量AWKLIBPATH。
答案 4 :(得分:0)
如果awk
不是必需的:
stat -c '%n %#8a' <pathnames>
还要查看stat --printf
和--terse
,它们在一行上打印一堆东西。