Я хочу получить выходные данные моей ls -l
команды:
-rw-r--r-- 1 root root 1866 Feb 14 07:47 rahmu.file
-rw-r--r-- 1 rahmu user 95653 Feb 14 07:47 foo.file
-rw-r--r-- 1 rahmu user 1073822 Feb 14 21:01 bar.file
Я хочу работать только grep rahmu
со столбцом $ 3, поэтому вывод моей grep
команды должен выглядеть следующим образом:
-rw-r--r-- 1 rahmu user 95653 Feb 14 07:47 foo.file
-rw-r--r-- 1 rahmu user 1073822 Feb 14 21:01 bar.file
Какой самый простой способ сделать это? Ответ должен быть переносимым во многих Unices, предпочтительно с акцентом на Linux и Solaris.
NB: я не ищу способ найти все файлы, принадлежащие данному пользователю. Этот пример был дан только для того, чтобы прояснить мой вопрос.
ls
своей природе хрупок (подумайте, что произойдет, если имя пользователя содержит пробелы - и да, это происходит на некоторых платформах). Используйтеfind
вместо этого.--printf
опцияstat
может пригодиться в тех местах, где вы могли бы иначе рассмотреть синтаксический анализls
. Но, как правило,find
это то , что вы хотите (как упомянуто @Gilles).Ответы:
Еще один раз
awk
спасает день!Вот простой способ сделать это с относительно простым синтаксисом:
или даже проще: (спасибо Peter.O в комментариях)
источник
ls -l | awk '$3=="rahmu"'
... и, кстати, открывающая(
скобка должна быть послеif
...awk '{if($3 ...'
LANG=C ls -l | awk ...
Если вы ищете соответствие только части строки в данном столбце, вы можете воспользоваться советом из https://stackoverflow.com/questions/17001849/awk-partly-string-match-if-column-partly-matches
источник
Если под столбцом вы подразумеваете столбец фиксированного размера, вы можете:
где
^
означает начало строки,.
означает любой символ и\{15\}
означает ровно 15 вхождений предыдущего символа (любой символ в данном случае).источник
Я знаю, что опаздываю на вечеринку, но я считаю, что общее решение этой проблемы заключается в использовании awk с регулярными выражениями, такими как:
Часть, заключенная в '//', может быть любым видом регулярного выражения.
источник
Чтобы выполнить поиск по одному столбцу имени пользователя (и распечатать только файлы), вы можете попробовать:
Для каталогов измените
-
наd
, для любого типа удалите-
.Он в основном выбирает каждый столбец, по
\S\+\s\+
которому совпадают непробельные символы, за которыми следуют пробельные символы, поэтому мы сопоставляем три первых столбца, а затем имя пользователя.источник