2011-01-17 39 views
6

Tôi cần nhận hàng dựa trên giá trị cột giống như truy vấn cơ sở dữ liệu. Tôi có một đầu ra lệnh như thế này,Lọc đầu ra lệnh Linux

Tên ID Mem VCPUs Nhà nước
Time (s)

Domain-0 0 15.485 16 r ----- 1779042,1

prime95-01 512 1
-b ---- 61.9

Ở đây tôi chỉ cần liệt kê những hàng có trạng thái "r". Một cái gì đó như thế này,

miền-0 0 15485 16
r ----- 1779042,1

Tôi đã cố gắng sử dụng "grep" và "awk" nhưng tôi vẫn không thể thành công .

Hãy giúp tôi về vấn đề này.

Kính trọng, Raaj

Trả lời

2

thử:

awk '$5 ~ /^r.*/ { print }' 

Như thế này:

cat file | awk '$5 ~ /^r.*/ { print }' 
+0

Cảm ơn rất nhiều. Điều này đã giúp giải quyết vấn đề của tôi. – Raajkumar

+3

@Raajkumar: Chào mừng bạn đến với StackOverflow. Vui lòng dành một phút để đọc phần này về cách chúng tôi nói 'cảm ơn rất nhiều' ở đây: http://stackoverflow.com/faq#howtoask – Johnsyweb

+0

@Raajkumar - tldr chấp nhận câu trả lời và upvote nếu bạn muốn – Ben

6

Có một variaty công cụ có sẵn cho việc lọc.

Nếu bạn chỉ muốn dòng với "r -----" grep là quá đủ:

command | grep "r-----" 

Hoặc

cat filename | grep "r-----" 

Quotes là không bắt buộc nhưng có thể ngăn chặn grep vấp ngã trên - giải pháp

+0

"Báo giá là tùy chọn nhưng có thể ngăn chặn grep vấp ngã trên-của "Họ đang có. Nhưng họ sẽ không. – Johnsyweb

0

grep 's:

command | grep -E "^([^ ]+){4}r" 

Điều này làm gì (-E chuyển sang mở rộng regexp):

Dấu mũ đầu tiên (^) khớp với đầu dòng. [^] khớp chính xác một lần xuất hiện của một ký tự không dấu cách, công cụ sửa đổi sau (+) cho phép nó khớp với nhiều lần xuất hiện hơn.

Được nhóm cùng với dấu cách trong ([^] +), nó khớp với bất kỳ chuỗi ký tự không dấu cách nào được theo sau bởi một dấu cách. Trình sửa đổi {4} yêu cầu cấu trúc này phải khớp chính xác bốn lần.

Chữ "r" duy nhất là ký tự chữ mà bạn đang tìm kiếm.

Nói cách đơn giản, dòng này có thể được viết như "Nếu dòng bắt đầu < ^> với bốn chuỗi theo sau là dấu cách < ([^] +) {4}> và ký tự tiếp theo .. "

Một giới thiệu rất tốt vào biểu thức thông thường đã được viết bởi Jan Goyvaerts (http://www.regular-expressions.info/quickstart.html)

2

grep có thể xử lý việc này cho bạn:

yourcommand | grep -- 'r-----' 

Nó thường hữu ích để lưu (full) đầu ra vào một tập tin để phân tích sau đó. Đối với điều này tôi sử dụng tee.

yourcommand | tee somefile | grep 'r-----' 

Nếu bạn muốn fi nd dòng có chứa "-b ----" một chút sau này mà không cần chạy yourcommand, bạn chỉ có thể sử dụng:

grep -- '-b----' somefile 

Không cần cat đây!

Tôi khuyên bạn nên đặt -- sau khi gọi tới grep vì mẫu của bạn chứa dấu trừ và nếu dấu trừ ở đầu mẫu, điều này sẽ giống như đối số tùy chọn grep thay vì một phần của mẫu .

+0

@downvoter: Tại sao? – Johnsyweb

+1

Điều này không hoạt động – Tyguy7

+0

Phần nào không hoạt động? Nó đã làm khi tôi viết nó gần bảy năm trước nhưng tôi vui mừng cập nhật nó nếu bạn có thể chỉ ra lỗi. – Johnsyweb

0

Lọc bởi cmd awk trong linux: -

Đầu tiên tìm thấy những cột cho cmd và cửa hàng này file2: -

awk '/ Domain-0 0 15.485 /' file1> file2

Output: -

domain-0 0 15.485 16 r ----- 1779042,1

sau đó cmd awk trong file2: -

awk '{print $ 1, $ 2, $ 3, $ 4, "\ n", $ 5, $ 6}' file2

Output cuối cùng: -

miền-0 0 15485 16

r ----- 1779042.1

Các vấn đề liên quan