Bagaimana saya bisa mengecualikan satu kata dengan grep?


Jawaban:


802

Anda dapat melakukannya dengan menggunakan -v(untuk --invert-match) pilihan grep sebagai:

grep -v "unwanted_word" file | grep XXXXXXXX

grep -v "unwanted_word" fileakan memfilter garis yang memiliki unwanted_worddan grep XXXXXXXXhanya akan menampilkan garis dengan pola XXXXXXXX.

EDIT:

Dari komentar Anda, sepertinya Anda ingin membuat daftar semua baris tanpa unwanted_word. Dalam hal ini yang Anda butuhkan adalah:

grep -v 'unwanted_word' file

2
bagaimana jika saya ingin mengecualikan N baris setelah baris dengan "kata yang tidak diinginkan" juga? -v 'unwanted_word' --after Ntidak membantu karena TERMASUK garis dan garis N setelah.
— Andrey Regentov

-vatau --invert-matchpilih jalur yang tidak cocok. Dalam kasus Anda grep -v 'unwanted_word' fileatau grep --invert-match 'unwanted_word' file.
— adamski.pro

Saya ingin mengabaikan satu baris di atas dan satu baris di bawah dengan pola yang cocok lalu Bagaimana saya bisa mencapainya?
— Kanji Viroja

Luar biasa, saya menggunakan ini di git untuk dengan cepat membaca status repo saya, bekerja seperti pesona:git status -s |grep -v "folder_I_dont_care"
— benjaminz

3
Aneh, itu jawaban teratas, tetapi dalam beberapa kasus itu salah! Jika saya ingin menemukan sun, kecuali ketika itu sunrise, grep sun|grep -v sunrisemelompati garis yang mengandung keduanya sundan sunrisesekaligus, itu bukan yang saya inginkan. grep -P 'sun(?!rise)'jauh lebih baik.
— Greene

86

Saya memahami pertanyaan sebagai "Bagaimana cara mencocokkan kata tetapi mengecualikan yang lain", yang satu solusinya adalah dua greps secara seri: Grep pertama menemukan "word1" yang dicari, grep kedua tidak termasuk "word2":

grep "word1" | grep -v "word2"

Dalam kasus saya: Saya perlu membedakan antara "plot" dan "#plot" yang opsi "kata" grep tidak akan lakukan ("#" bukan menjadi alfanumerik).

Semoga ini membantu.


16
Anda harus membalik urutan untuk mendapatkan sorotan word1.
— Matius Baca

1
Saya kira itu akan mengklarifikasi untuk menambahkan placeholder untuk nama file ke contoh itu
— patrick

39

Jika Anda grepmendukung Perl ekspresi reguler dengan -Popsi yang dapat Anda lakukan (jika bash; jika tcsh Anda harus lolos dari !):

grep -P '(?!.*unwanted_word)keyword' file

Demo:

$ cat file
foo1
foo2
foo3
foo4
bar
baz

Mari kita daftar semua fookecualifoo3

$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$ 

Terima kasih untuk ini, sangat berguna! Saya ingin menyebutkan bahwa Perintah grep adalah case sensitive secara default
— DocWiki

2
Perhatikan bahwa ini grep -v -Pjuga berfungsi tanpa negasi dalam ekspresi reguler.
— cybersoft

"Jika bash ... Anda harus melarikan diri dari !" . Terima kasih terima kasih terima kasih! Itu yang saya inginkan!
— Gabriel Staples

36

Solusi yang tepat adalah menggunakan grep -v "word" file, dengan yang awksetara:

awk '!/word/' file

Namun, jika Anda memiliki situasi yang lebih kompleks di mana Anda ingin, katakanlah, XXXuntuk muncul dan YYY tidak muncul, maka lebih awkberguna daripada memipis beberapa grep:

awk '/XXX/ && !/YYY/' file
#    ^^^^^    ^^^^^^
# I want it      |
#            I don't want it

Anda bahkan dapat mengatakan sesuatu yang lebih kompleks. Misalnya: Saya ingin baris-baris itu mengandung salah satu XXXatau YYY, tetapi tidak ZZZ:

awk '(/XXX/ || /YYY/) && !/ZZZ/' file

dll.


2
Tampaknya jauh lebih cepat daripada grep -Psolusi pada file besar.
— MBR

@ MBR grep -Pberarti menggunakan Perl regexp, jadi memuat paket itu akan jauh lebih mahal dari biasanya grep.
— fedorqui 'SO berhenti merugikan'

10

Balikkan kecocokan menggunakan grep -v:

grep -v "unwanted word" file pattern

6

grep menyediakan opsi '-v' atau '--invert-match' untuk memilih jalur yang tidak cocok.

misalnya

grep -v 'unwanted_pattern' file_name

Ini akan menampilkan semua baris dari file nama file, yang tidak memiliki 'unwanted_pattern'.

Jika Anda mencari pola di banyak file di dalam folder, Anda dapat menggunakan opsi pencarian rekursif sebagai berikut

grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'

Di sini grep akan mencoba membuat daftar semua kemunculan 'wanted_pattern' di semua file dari dalam direktori saat ini dan meneruskannya ke grep kedua untuk menyaring 'tidak diinginkan_pattern'. '|' - pipe akan memberitahu shell untuk menghubungkan output standar program kiri (grep -r 'wanted_pattern' *) ke input standar program yang benar (grep -v 'unwanted_pattern').


4

The -vpilihan akan menampilkan semua baris yang tidak cocok dengan pola.

grep -v ^unwanted_word

-5

Saya memiliki direktori dengan banyak file. Saya ingin menemukan semua file yang TIDAK berisi string "speedup" jadi saya berhasil menggunakan perintah berikut:

grep -iL speedup *

1
Dari halaman manual: "-L, --files-without-match Menekan output normal; alih-alih cetak nama setiap file input dari mana tidak ada output biasanya akan dicetak. Pemindaian akan berhenti pada pertandingan pertama. " (Penekanan oleh saya) Jadi berhati-hatilah!
— xuiqzy
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.