Tại sao grep + regex của tôi không hoạt động?


9

Gần đây tôi đã quyết định rằng đủ là đủ - tôi sẽ học cách sử dụng grep một cách trôi chảy. Đã ba giờ trôi qua và tôi đã bị vướng vào vấn đề đồ chơi này.

Tôi hiện đang đồng bộ hóa một mảng RAID5, tiến trình có thể được theo dõi bằng cách đọc /proc/mdstat. Đầu ra của cat /proc/mdstatđược hiển thị dưới đây.

$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md1 : active raid5 sda4[0] sdb4[1] sdc4[2]
      5858765824 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
      [=============>.......]  resync = 67.3% (1972073120/2929382912) finish=205.7min speed=77537K/sec

md0 : active raid5 sda3[0] sdb3[1] sdc3[2]
      998400 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

Để giải trí, tôi nghĩ rằng tôi sẽ sử dụng watchđể theo dõi /proc/mdstattrong thời gian thực, chuyển đầu ra thành grep và chỉ hiển thị thời gian còn lại ước tính.

Cách tiếp cận của tôi như sau:

watch cat /proc/mdstat | grep finish=\d+\.\d | grep \d+\.\d

Tôi không biết tại sao điều này không tạo ra đầu ra. Trong thực tế, biểu thức grep đầu tiên không tạo ra đầu ra, mặc dù nó dường như hoạt động trên Regex101 .

Tôi đang làm gì sai?


Bạn không thể sử dụng \dvà luôn trích dẫn một regex bên trong grep. Xem cú pháp biểu thức chính quy 'grep' .
Radu Rădeanu

Câu trả lời:


19

Nếu bạn muốn sử dụng cú pháp regex, bạn cần chuyển đổi -P với grep. Kiểm tra câu hỏi trước đây ở đây Có phải cú pháp grep khác với regex không?


Câu trả lời tuyệt vời - súc tích, chính xác và có thêm tài liệu tham khảo để khởi động! Cảm ơn bạn!
blz

6
  • Bạn nên trích dẫn biểu thức của bạn để shell không diễn giải nó
  • grepkhông có \dlối thoát, bạn sẽ cần phải sử dụng [0-9]thay thế.
  • +cần phải được trốn thoát mà không có công -Etắc.

Điều này sẽ làm việc:

watch cat /proc/mdstat | grep 'finish=[0-9]\+\.[0-9]' | grep '[0-9]\+\.[0-9]'

Tôi đã chấp nhận câu trả lời của kenn vì công -Ptắc sẽ cho phép tôi sử dụng các biểu thức chính quy theo cách mà tôi đã khá thoải mái. Tuy nhiên, tôi vẫn nâng cao câu trả lời của bạn, bởi vì đó là một giải pháp tốt. Tôi sẽ ghi nhớ điều này! Cảm ơn!
blz

3
@blz Grep hỗ trợ 3 'kiểu' biểu thức chính quy: "cơ bản" -G (mặc định), "mở rộng" -E và "perl" -P. Chế độ cơ bản đòi hỏi phải ?, +, {, |, (, and )được thoát ra để có ý nghĩa đặc biệt.
kiri

0

Sử dụng sedthay thế, điều này làm việc cho tôi:

watch "cat /proc/mdstat | grep 'finish\=' | sed -e 's/.*finish\=\([0-9,\.]*\).*/\1/g'"

OP muốn "học cách sử dụng grep một cách trôi chảy."
Radu Rădeanu

@chaos, Không biết về sed. Tôi đang ghi chú tinh thần về điều này =)
blz
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.