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?


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".


12

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


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'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.