Как запустить grep для одного столбца?

42

Я хочу получить выходные данные моей 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: я не ищу способ найти все файлы, принадлежащие данному пользователю. Этот пример был дан только для того, чтобы прояснить мой вопрос.

rahmu
источник
5
Обратите внимание, что анализ выходных данных по lsсвоей природе хрупок (подумайте, что произойдет, если имя пользователя содержит пробелы - и да, это происходит на некоторых платформах). Используйте findвместо этого.
Жиль "ТАК - перестань быть злым"
Это не отвечает на заглавный вопрос, но я упомяну, что --printfопция statможет пригодиться в тех местах, где вы могли бы иначе рассмотреть синтаксический анализ ls. Но, как правило, findэто то , что вы хотите (как упомянуто @Gilles).
Wildcard

Ответы:

49

Еще один раз awkспасает день!

Вот простой способ сделать это с относительно простым синтаксисом:

ls -l | awk '{if ($3 == "rahmu") print $0;}'

или даже проще: (спасибо Peter.O в комментариях)

ls -l | awk '$3 == "rahmu"' 
rahmu
источник
9
Или: ls -l | awk '$3=="rahmu"'... и, кстати, открывающая (скобка должна быть после if...awk '{if($3 ...'
Peter.O
3
@ Peter.O +1 от меня. Ваша команда более краткая, правильная, так как print используется по умолчанию для соответствия awk.
BSD
Чтобы избежать проблем с локализацией (формат даты влияет на порядок столбцов), часто предлагается обеспечить стандартный формат и язык:LANG=C ls -l | awk ...
fheub
11

Если под столбцом вы подразумеваете столбец фиксированного размера, вы можете:

ls -l | grep "^.\{15\}rahmu"

где ^означает начало строки, .означает любой символ и \{15\}означает ровно 15 вхождений предыдущего символа (любой символ в данном случае).

jfg956
источник
2

Я знаю, что опаздываю на вечеринку, но я считаю, что общее решение этой проблемы заключается в использовании awk с регулярными выражениями, такими как:

awk '$3~/rahmu/{print}' input_file

Часть, заключенная в '//', может быть любым видом регулярного выражения.

PejoPhylo
источник
1

Чтобы выполнить поиск по одному столбцу имени пользователя (и распечатать только файлы), вы можете попробовать:

ls -la | grep "^-\S\+\s\+\S\+\s\+rahmu"

Для каталогов измените -на d, для любого типа удалите -.

Он в основном выбирает каждый столбец, по \S\+\s\+которому совпадают непробельные символы, за которыми следуют пробельные символы, поэтому мы сопоставляем три первых столбца, а затем имя пользователя.

kenorb
источник