2012-05-20 2 views
1

Мне интересно, что такое синтаксическая ошибка в моей команде, которую я использую.UNIX: Использование awk-команд для фильтрации списков?

В текущем каталоге я использую команду ls -l для получения прав доступа к файлу в моем каталоге.

Как выполнить запрос, чтобы узнать, какие файлы доступны для чтения, записи и выполнения пользователем, а затем распечатать отфильтрованный список с помощью awk?

Я знаю, что бит, который меня интересует, это второй, третий и четвертый.

Например,

-rw-r----- .. .. .. .. 

или

drw-r----- .. .. .. .. 

У меня есть команда AWK следующим образом:

ls -l | awk '{if{$1 == /.rwx....../}print "line"}' 

Я пробовал много вещей, но все еще есть ошибка синтаксиса.

Любая помощь очень ценится! Заранее спасибо!

+1

Если ваша система имеет 'stat' вы должны использовать, что вместо [разборе команду ls] (http://mywiki.wooledge.org/ParsingLs). Кроме того, если ваш 'find' поддерживает его, попробуйте' find -perms u = rw -type f' или другие разрешения, такие как 'u = rwx',' -g = x' или '/ u = w, g = w' , См. 'Man find' для получения информации о значении этих шаблонов. –

ответ

3

Оператор, используемый для проверки соответствия строки правильному выражению ~, а не ==. Кроме того, использование () вокруг условия в if заявлении:

ls -l | awk '{ if ($1 ~ /.rwx....../) print "line" }' 
+0

А, отметил, я сделал опечатку в вопросе. Даже когда ~ это все еще дает мне синтаксическую ошибку. Но скобки. Это была проблема. Большое вам спасибо за вашу помощь! –

+0

К сожалению, мне нужно подождать 9 минут. Но спасибо! :) –

0

Я согласен с Денисом; это лучше всего, чтобы избежать трубопровода ls и если вы собираетесь сделать что-то, вы можете также сделать это правильно, используя stat:

stat -c '%A %N' * | awk '/^-rwx/ { print $2 }' | sed "s%^.\(.*\).$%\1%"

или просто в AWK:

stat -c '%A %N' * | awk '/^-rwx/ { print substr ($2, 2, length ($2) - 2) }'

EDIT:

Приведенное выше не удается с файлами, содержащими пробелы (извините). Это учитывает пробелы и символы новой строки символов:

stat -c '%A %N' * | awk '/^-rwx/ {print substr($0, 13, length($0) - 13) }'

+0

Проблема с использованием '$ 2' заключается в том, что она не работает для файлов с пробелами в их именах. Это может быть лучше: 'stat -c '% A% N' * | awk '/^- rwx/{print substr ($ 0, 13, length ($ 0) - 13)}' '(или вы можете использовать'% n' и 'print substr ($ 0, 12)') –

+0

@DennisWilliamson Ahh yes мой один лайнер не находит файлы с пробелами в них. Кроме того, я думаю, что '% n' терпит неудачу с файлами, содержащими символы новой строки:' \ n' расширяется? – Steve

Смежные вопросы