Cách làm thanh dọc | làm việc trong grep?


10

Đây là một ví dụ về dòng lệnh grep tôi đã thử:

grep '(565172|565173|565175)' /var/log/cups/error_log

Nó không tạo ra bất kỳ đầu ra nào, mặc dù cả 3 giá trị đều nằm trong tệp nhiều lần.

Tôi đã thử thoát khỏi các thanh và điều đó đã cải thiện phần nào - giá trị trung bình được phát hiện nhưng không phải là giá trị đầu tiên hoặc cuối cùng.

grep '(565172\|565173\|565175)' /var/log/cups/error_log

Tôi cũng đã thử thoát gấp đôi và quay lại không nhận được kết quả.

grep '(565172\\|565173\\|565175)' /var/log/cups/error_log

Tôi đang làm gì sai? Cảm ơn.

Câu trả lời:


14

Cú pháp bạn đang cố sử dụng thuộc về các biểu thức chính quy mở rộng, vì vậy câu trả lời rất đơn giản, sử dụng egrephoặc bao gồm -Ecờ.


17

Những gì bạn đang chạy vào là sự khác biệt giữa các biểu thức thông thường cơ bản và mở rộng. Từ trang hướng dẫn của grep:

Trong các biểu thức chính quy cơ bản, các ký tự meta ?, +, {, |, (Và) mất ý nghĩa đặc biệt của chúng; thay vào đó, hãy sử dụng các phiên bản gạch chéo ngược \?, +, {, \ |, (, và).

Vì vậy, bạn có thể làm một trong những điều sau đây:

 grep '\(565172\|565173\|565175\)' /var/log/cups/error_log

hoặc là

grep -E '(565172|565173|565175)' /var/log/cups/error_log

Cờ -E bật biểu thức chính quy "Mở rộng". GNU grep cũng hỗ trợ các biểu thức chính quy tương thích perl.


Đã bị phân tâm khi viết câu trả lời của tôi. Có vẻ như Adam đã đánh tôi đến cú đấm.
Steven D

4
Nhưng bạn đã thêm vào lời giải thích - lý do tôi không thể làm cho nó hoạt động là vì tôi chỉ thoát khỏi quán bar chứ không phải là parens.
Đánh dấu tiền chuộc

1
Tôi không biết rằng bạn có thể thoát khỏi những nhân vật đặc biệt này một lần nữa để có được kết quả tương tự, vì vậy +1 cho bạn!
Adam Byrtek

1
Trên đây là tập hợp trao đổi văn minh nhất mà tôi từng thấy trong SO / SE.
mike gặm nhấm
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.