Jawaban:
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
-v 'unwanted_word' --after Ntidak membantu karena TERMASUK garis dan garis N setelah.
-vatau --invert-matchpilih jalur yang tidak cocok. Dalam kasus Anda grep -v 'unwanted_word' fileatau grep --invert-match 'unwanted_word' file.
git status -s |grep -v "folder_I_dont_care"
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.
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 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
$
grep -v -Pjuga 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 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.
grep -Psolusi pada file besar.
grep -Pberarti 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"