использование awk и stat в одной строке для вывода значений stat - PullRequest
0 голосов
/ 29 ноября 2018

Ниже приведен скрипт, который я пытаюсь запустить.Невозможно использовать stat внутри awk.

cat /etc/passwd | awk 'BEGIN{FS=":"}{print $6 }' | (stat $6 | sed -n '/^Access: (/{s/Access: (\([0-9]\+\).*$/\1/;p}' })'

Мой желаемый вывод должен быть таким: / root 0550 / bin 0777 / sbin 0777 Я могу написать скрипт, используя while или for .., но я хочу, чтобы всескрипт должен находиться в одной строке без цикла.

Ответы [ 4 ]

0 голосов
/ 29 ноября 2018

GNU awk имеет расширение образца filefuncs, которое имеет функцию stat.Ниже приведен пример кода из документации :

$ 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. Вы такжеможет потребоваться установить переменную оболочки AWKLIBPATH для расширения.

0 голосов
/ 29 ноября 2018

Это должно работать?

 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
}
0 голосов
/ 29 ноября 2018

Это, вероятно, будет намного проще / быстрее, если вы все сделаете на Perl:

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
  • простого и гибкого форматирования вывода с помощью printf
0 голосов
/ 29 ноября 2018

конечно $6 не означает, что вы думаете за пределами awk, вы можете сделать вместо этого

$ awk -F: '{print $6}' /etc/passwd | xargs -n1 stat | sed  ...
...