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).
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 YYYtidak 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:
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').
Saya memiliki direktori dengan banyak file. Saya ingin menemukan semua file yang TIDAK berisi string "speedup" jadi saya berhasil menggunakan perintah berikut:
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!
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"
Jawaban:
Anda dapat melakukannya dengan menggunakan
-v
(untuk--invert-match
) pilihan grep sebagai:grep -v "unwanted_word" file
akan memfilter garis yang memilikiunwanted_word
dangrep XXXXXXXX
hanya akan menampilkan garis dengan polaXXXXXXXX
.EDIT:
Dari komentar Anda, sepertinya Anda ingin membuat daftar semua baris tanpa
unwanted_word
. Dalam hal ini yang Anda butuhkan adalah:sumber
-v 'unwanted_word' --after N
tidak membantu karena TERMASUK garis dan garis N setelah.-v
atau--invert-match
pilih jalur yang tidak cocok. Dalam kasus Andagrep -v 'unwanted_word' file
ataugrep --invert-match 'unwanted_word' file
.git status -s |grep -v "folder_I_dont_care"
sun
, kecuali ketika itusunrise
,grep sun|grep -v sunrise
melompati garis yang mengandung keduanyasun
dansunrise
sekaligus, itu bukan yang saya inginkan.grep -P 'sun(?!rise)'
jauh lebih baik.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":
Dalam kasus saya: Saya perlu membedakan antara "plot" dan "#plot" yang opsi "kata" grep tidak akan lakukan ("#" bukan menjadi alfanumerik).
Semoga ini membantu.
sumber
word1
.Jika Anda
grep
mendukung Perl ekspresi reguler dengan-P
opsi yang dapat Anda lakukan (jika bash; jika tcsh Anda harus lolos dari!
):Demo:
Mari kita daftar semua
foo
kecualifoo3
sumber
grep -v -P
juga berfungsi tanpa negasi dalam ekspresi reguler.!
" . Terima kasih terima kasih terima kasih! Itu yang saya inginkan!Solusi yang tepat adalah menggunakan
grep -v "word" file
, dengan yangawk
setara:Namun, jika Anda memiliki situasi yang lebih kompleks di mana Anda ingin, katakanlah,
XXX
untuk muncul danYYY
tidak muncul, maka lebihawk
berguna daripada memipis beberapagrep
:Anda bahkan dapat mengatakan sesuatu yang lebih kompleks. Misalnya: Saya ingin baris-baris itu mengandung salah satu
XXX
atauYYY
, tetapi tidakZZZ
:dll.
sumber
grep -P
solusi pada file besar.grep -P
berarti menggunakan Perl regexp, jadi memuat paket itu akan jauh lebih mahal dari biasanyagrep
.Balikkan kecocokan menggunakan grep -v:
sumber
grep menyediakan opsi '-v' atau '--invert-match' untuk memilih jalur yang tidak cocok.
misalnya
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
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').
sumber
The
-v
pilihan akan menampilkan semua baris yang tidak cocok dengan pola.sumber
Saya memiliki direktori dengan banyak file. Saya ingin menemukan semua file yang TIDAK berisi string "speedup" jadi saya berhasil menggunakan perintah berikut:
sumber