Menggunakan grep -v pada banyak argumen

12

Apakah ada cara yang lebih sederhana untuk melakukan ini? grep -v foo file | grep -v bar

Mungkin ada cara yang sangat elegan untuk melakukannya dengan egrep, tetapi bagaimana cara menggunakan grep tua biasa?

EDIT: grep -v 'foo\|bar' filetampaknya hanya berfungsi dengan GNU grep. Saya menggunakan Solaris. Ada solusi untuk itu?

rahmu
sumber
Pertanyaan aneh karena pada contoh pertama Anda melakukan pertandingan DAN, dan di pertanyaan kedua Anda melakukan pertandingan ATAU. Hasilnya akan sama hanya dalam kondisi yang sangat spesifik.
greenoldman
1
Tidak terlalu. Dalam contoh kedua, -vbendera adalah negasi. not(A or B) == not(A) and not(B)
rahmu

Jawaban:

21

Anda dapat memiliki beberapa pengujian dalam satu grepperintah dengan melewatkan setiap ekspresi dengan -eargumen alih-alih sebagai argumen non-opsi pertama seperti yang biasanya Anda lihat:

$ grep -v -e foo -e bar file

Itu mengatakan hal yang sama dengan perintah Anda: mencetak baris fileyang tidak mengandung "foo" atau "bar".

Perlu diingat bahwa menghapus -vsepenuhnya membalikkan ini; itu mengubah operasi logis juga! Anda mendapatkan semua baris yang berisi "foo" atau "bar".

Warren Young
sumber
12

grep -Ev 'word1|word2' harus bekerja dengan baik

Biarkan aku menjadi
sumber
Sebagai alternatif, Anda dapat menggunakan egrep dan menjatuhkan backslash untuk karakter pipa:egrep -v 'word1|word2
OldTimer
Ternyata ini tidak bekerja dengan grep Solaris. Saya menginstal grep GNU dan bekerja dengan sempurna. Saya akan mengedit pertanyaan saya untuk membuatnya spesifik Solaris.
rahmu
2
@rahmu \|adalah ekstensi grep GNU, tetapi Anda dapat mencapai hal yang sama dengan cara yang portabel dengan -Edan |operator.
Gilles 'SANGAT berhenti menjadi jahat'