Bagaimana saya bisa mengecualikan satu kata dengan grep?

467

Saya butuh sesuatu seperti:

grep ^"unwanted_word"XXXXXXXX
john
sumber
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"
Kanagavelu Sugumar

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
codaddict
sumber
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.

JPGConnolly
sumber
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
$ 
codaddict
sumber
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.

fedorqui 'SO berhenti merugikan'
sumber
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
garima
sumber
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').

Shriganesh Shintre
sumber
4

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

grep -v ^unwanted_word
st0le
sumber
-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 *
pjrieger
sumber
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