grep với toán tử logic


19

Có một tiện ích giống như grep sẽ cho phép tôi thực hiện tìm kiếm grep với các toán tử logic. Tôi muốn có thể lồng và kết hợp các cấu trúc logic một cách tự do. Ví dụ: những thứ như thế này nên có thể:

grep (term1 && term2) || (term1 && (term3 xor term4)) *

Tôi nhận ra điều này có thể được thực hiện với vanilla grep và kịch bản bash bổ sung, nhưng mục tiêu của tôi ở đây là để tránh phải làm điều đó.

grep 

Câu trả lời:


12

Với awk, như với perl, bạn sẽ phải bao gồm các điều khoản //, nhưng nó có thể được thực hiện:

awk '(/term1/ && /term2/) || (/term1/ && xor(/term3/, /term4/))' 

28

Có rất nhiều cách để sử dụng grepvới các toán tử logic.

  1. Sử dụng \|để tách nhiều mẫu cho điều kiện OR .

    Thí dụ: grep 'pattern1\|pattern2' filename

  2. Sử dụng -Etùy chọn để gửi nhiều mẫu cho điều kiện OR .

    Thí dụ: grep -E 'pattern1|pattern2' filename

  3. Sử dụng một -emẫu chỉ khớp với một mẫu, nhưng sử dụng nhiều -etùy chọn khớp với nhiều mẫu.

    Thí dụ: grep -e pattern1 -e pattern2 filename

  4. grep -vcó thể mô phỏng hoạt động KHÔNG .

  5. Không có toán tử ANDgrep , nhưng bạn có thể mô phỏng AND bằng cách sử dụng -Etùy chọn.

    Thí dụ : grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename

    Ví dụ trên sẽ khớp với tất cả các dòng chứa cả mẫu1mẫu2 theo thứ tự.)


1
-Ekhông hoàn toàn tương đương với &&thực tế là nó nhạy cảm với trật tự
iruvar

grep foo | grep barlà một cách tổng quát hơn để làm VÀ.
Kenster

2
+1 để giải thích rõ ràng rằng không có toán tử "VÀ" thực sự và điều tốt nhất chúng ta có thể làm là mô phỏng một vụ hack bằng cấu trúc OR. Điều này tất nhiên sẽ trở nên khó sử dụng với hơn 3 điều khoản, nhưng đối với hai điều khoản thì nó hoạt động tốt.
Eric Hepperle - CodeSlayer2010

grep -c -e MATCH1 -e MATCH2 thật tuyệt vời khi bạn quan tâm đến số lượng tên tệp.
andrej

4

Bạn có thể sử dụng perl:

perl -wne 'print if (/term1/ && /term2/) || (/term1/ && (/term3/ xor /term4/))'

0
sed '/term1/!d;/term2/b' -e '/term3/!d;/term4/d' *

Tôi tin rằng hoàn thành những gì bạn đang cố gắng làm. Nó loại dbỏ khỏi đầu ra bất kỳ dòng nào không khớp term1, nó btách ra khỏi tập lệnh (và do đó tự động in) bất kỳ dòng nào còn lại và phù hợp term2, và đối với các dòng còn lại sẽ xóa bất kỳ dòng nào không khớp term3và từ bất kỳ dòng nào khớp. term4.

sed các tập lệnh được đánh giá theo thứ tự và tất cả các bài kiểm tra là boolean, vì vậy mọi hành động phát sinh từ một bài kiểm tra sẽ ảnh hưởng trực tiếp đến hành vi của bất kỳ hành động nào sau đây.


0

Tôi sử dụng để xâu chuỗi grepcác lệnh để đạt được logic VÀ:

grep expr1 filename | grep expr2

Tôi tin rằng nó khá đơn giản, giống Unix và thanh lịch.


Sau đó, bạn có thể kết hợp (như @Tushi giải thích kỹ lưỡng) với -Etùy chọn cho OR-ing và -vcho phủ định.

Ví dụ cụ thể của bạn khá khó chịu và có thể sẽ được hưởng lợi từ một số tiện ích mạnh mẽ hơn (xem câu trả lời của @ muru).

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.