Як запустити 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

Який найпростіший спосіб це зробити? Відповідь має бути переносним у багатьох Юнісах, бажано зосередитись на Linux та Solaris.

NB: Я не шукаю способу знайти всі файли, що належать даному користувачеві. Цей приклад був поданий лише для того, щоб зробити моє запитання зрозумілішим.


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"' 

9
Або: ls -l | awk '$3=="rahmu"'... і до речі, (кронштейн для відкриття повинен бути після if...awk '{if($3 ...'
Пітер.O

3
@ Peter.O +1 від мене. Ваша команда більш лаконічна, правильна, оскільки друк - це типовий параметр для збігу awk.
bsd

Щоб уникнути проблем із локалізацією (формат дати впливає на порядок стовпців), часто пропонується забезпечити стандартний формат та мову:LANG=C ls -l | awk ...
вчера


11

Якщо під стовпцем ви маєте на увазі стовпець фіксованого розміру, ви могли б:

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

де ^означає початок рядка, .означає будь-який символ і \{15\}означає рівно 15 подій попереднього символу (будь-який символ у цьому випадку).


2

Я знаю, що я спізнююсь з учасником, але я вважаю, що дуже загальним рішенням цієї проблеми є використання awk з регулярними виразами, як-от так:

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

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


1

Щоб підключити зображення на основі одного стовпця імені користувача (та друкувати лише файли), ви можете спробувати:

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

Для каталогів перейдіть -на dвидалення для будь-якого типу -.

В основному він вибирає кожен стовпець, за \S\+\s\+яким збігаються символи, що не пробіли, а потім символи пробілу, тому ми підбираємо три перші стовпці, а потім ім’я користувача.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.