在一行中使用awk和stat打印stat的值

时间:2018-11-29 00:22:37

标签: linux shell awk sed stat

下面是我要运行的脚本。无法在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编写脚本。但是我希望所有脚本都在一行中而没有循环。

5 个答案:

答案 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,它们在一行上打印一堆东西。