Jawaban:
Anda dapat melakukannya dengan menggunakan -v
(untuk --invert-match
) pilihan grep sebagai:
grep -v "unwanted_word" file | grep XXXXXXXX
grep -v "unwanted_word" file
akan memfilter garis yang memiliki unwanted_word
dan grep XXXXXXXX
hanya 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
-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 Anda grep -v 'unwanted_word' file
atau grep --invert-match 'unwanted_word' file
.
git status -s |grep -v "folder_I_dont_care"
sun
, kecuali ketika itu sunrise
, grep sun|grep -v sunrise
melompati garis yang mengandung keduanya sun
dan sunrise
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":
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.
word1
.
Jika Anda grep
mendukung Perl ekspresi reguler dengan -P
opsi 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 foo
kecualifoo3
$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$
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 yang awk
setara:
awk '!/word/' file
Namun, jika Anda memiliki situasi yang lebih kompleks di mana Anda ingin, katakanlah, XXX
untuk muncul dan YYY
tidak muncul, maka lebih awk
berguna 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 XXX
atau YYY
, tetapi tidak ZZZ
:
awk '(/XXX/ || /YYY/) && !/ZZZ/' file
dll.
grep -P
solusi pada file besar.
grep -P
berarti menggunakan Perl regexp, jadi memuat paket itu akan jauh lebih mahal dari biasanya grep
.
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').
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 *
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"