Sử dụng grep -v trên nhiều đối số


12

Có cách nào đơn giản hơn để làm điều này? grep -v foo file | grep -v bar

Có thể có những cách rất thanh lịch để làm điều đó với egrep, nhưng làm thế nào để đi với grep cũ đơn giản?

EDIT: grep -v 'foo\|bar' filedường như chỉ hoạt động với GNU grep. Tôi đang ở Solaris. Bất kỳ giải pháp cho điều đó?


Câu hỏi kỳ lạ bởi vì trong ví dụ đầu tiên bạn đang thực hiện khớp AND và trong lần thứ hai bạn đang thực hiện khớp OR. Kết quả sẽ giống nhau chỉ trong điều kiện rất cụ thể.
greenoldman

1
Không thật sự lắm. Trong ví dụ thứ hai, -vcờ là một phủ định. not(A or B) == not(A) and not(B)
rahmu

Câu trả lời:


21

Bạn có thể có nhiều kiểm tra trong một greplệnh bằng cách chuyển từng biểu thức với một -eđối số thay vì là đối số không phải tùy chọn đầu tiên như bạn thường thấy:

$ grep -v -e foo -e bar file

Điều đó nói lên điều tương tự lệnh của bạn thực hiện: in các dòng từ fileđó không chứa "foo" hay "bar".

Hãy nhớ rằng loại bỏ -vhoàn toàn đảo ngược điều này; Nó cũng thay đổi hoạt động hợp lý! Bạn nhận được tất cả các dòng có chứa "foo" hoặc "bar".


12

grep -Ev 'word1|word2' nên làm việc tốt


Để thay thế, bạn có thể sử dụng egrep và bỏ dấu gạch chéo ngược cho ký tự ống dẫn:egrep -v 'word1|word2
OldTimer

Hóa ra điều này không hoạt động với Solaris grep. Tôi đã cài đặt GNU grep và hoạt động hoàn hảo. Tôi sẽ chỉnh sửa câu hỏi của mình để biến nó thành Solaris cụ thể.
rahmu

2
@rahmu \|là một phần mở rộng GNU grep, nhưng bạn có thể đạt được điều tương tự theo cách di động với -E|toán tử.
Gilles 'SO- ngừng trở nên xấu xa'
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.