Làm thế nào để chạy grep trên một cột duy nhất?


42

Tôi muốn grep đầu ra của ls -llệnh của tôi :

-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

Tôi chỉ muốn chạy grep rahmutrên cột $ 3, vì vậy đầu ra của greplệnh của tôi sẽ giống như thế này:

-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

Cách đơn giản nhất để làm điều đó là gì? Câu trả lời phải có sẵn trên nhiều Unice, tốt nhất là tập trung vào Linux và Solaris.

Lưu ý: Tôi không tìm cách tìm tất cả các tệp thuộc về một người dùng nhất định. Ví dụ này chỉ được đưa ra để làm cho câu hỏi của tôi rõ ràng hơn.


5
Lưu ý rằng phân tích cú pháp đầu ra lsvốn đã rất mong manh (hãy nghĩ điều gì xảy ra nếu tên người dùng chứa khoảng trắng - và vâng, điều này xảy ra trên một số nền tảng). Sử dụng findthay thế.
Gilles 'SO- ngừng trở nên xấu xa'

Điều này không trả lời câu hỏi tiêu đề, nhưng tôi sẽ đề cập rằng --printftùy chọn statcó thể có ích ở những nơi mà bạn có thể xem xét phân tích cú pháp ls. Nhưng thông thường, findlà những gì bạn muốn (như @Gilles đã đề cập).
tự đại diện

Câu trả lời:


49

Thêm một lần awktiết kiệm trong ngày!

Đây là một cách đơn giản để làm điều đó, với một cú pháp tương đối đơn giản:

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

hoặc thậm chí đơn giản hơn: (Cảm ơn Peter.O trong các bình luận)

ls -l | awk '$3 == "rahmu"' 

9
Hoặc: ls -l | awk '$3=="rahmu"'... và nhân tiện, (khung mở đầu sẽ là sau if...awk '{if($3 ...'
Peter.O

3
@ Peter.O +1 từ tôi. Lệnh của bạn ngắn gọn hơn, chính xác, vì in là mặc định cho một trận đấu awk.
bsd

Để tránh các vấn đề nội địa hóa (định dạng ngày ảnh hưởng đến thứ tự cột), thường được đề xuất để đảm bảo định dạng và ngôn ngữ tiêu chuẩn:LANG=C ls -l | awk ...
fheub


11

Nếu theo cột, bạn có nghĩa là cột có kích thước cố định, bạn có thể:

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

trong đó ^có nghĩa là bắt đầu của dòng, .có nghĩa là bất kỳ ký tự nào và \{15\}có nghĩa là chính xác 15 lần xuất hiện của ký tự trước đó (bất kỳ ký tự nào trong trường hợp này).


2

Tôi biết tôi đến bữa tiệc muộn, nhưng tôi tin rằng một giải pháp rất chung cho vấn đề này là sử dụng awk với các biểu thức thông thường như vậy:

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

Phần được bao quanh bởi '//' có thể là bất kỳ loại biểu thức chính quy nào.


1

Để grep dựa trên cột tên người dùng duy nhất (và chỉ in các tệp), bạn có thể thử:

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

Đối với thư mục, thay đổi -thành d, cho bất kỳ loại bỏ -.

Về cơ bản, nó chọn từng cột \S\+\s\+phù hợp với một ký tự không phải khoảng trắng theo sau là một ký tự khoảng trắng, vì vậy chúng tôi khớp ba cột đầu tiên và sau đó là tên người dùng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.