ฉันจะยกเว้นคำเดียวด้วย grep ได้อย่างไร


คำตอบ:


802

คุณสามารถทำได้โดยใช้-v(สำหรับ--invert-match) ตัวเลือกของ grep เป็น:

grep -v "unwanted_word" file | grep XXXXXXXX

grep -v "unwanted_word" fileจะกรองสายที่มีunwanted_wordและจะแสดงเพียงเส้นที่มีรูปแบบgrep XXXXXXXXXXXXXXXX

แก้ไข:

unwanted_wordจากความคิดเห็นของคุณดูเหมือนว่าคุณต้องการที่จะแสดงรายการทุกสายได้โดยไม่ต้อง ในกรณีที่คุณต้องการคือ:

grep -v 'unwanted_word' file

2
ถ้าฉันต้องการแยกบรรทัด N บรรทัดหลังบรรทัดด้วย "คำที่ไม่ต้องการ" ด้วยล่ะ -v 'unwanted_word' --after Nไม่ช่วยเพราะมันรวมถึงบรรทัดและบรรทัด N หลัง
Andrey Regentov

-vหรือ--invert-matchเลือกบรรทัดที่ไม่ตรงกัน ในกรณีของคุณหรือgrep -v 'unwanted_word' file grep --invert-match 'unwanted_word' file
adamski.pro

ฉันต้องการละเว้นหนึ่งบรรทัดด้านบนและอีกหนึ่งบรรทัดด้านล่างที่มีรูปแบบการจับคู่จากนั้นฉันจะบรรลุได้อย่างไร
Kanji Viroja

น่ากลัวฉันจะใช้นี้ในคอมไพล์ได้อย่างรวดเร็วอ่านสถานะของธุรกรรมซื้อคืนฉันทำงานเช่นเสน่ห์:git status -s |grep -v "folder_I_dont_care"
benjaminz

3
แปลกมันเป็นคำตอบที่ดีที่สุด แต่ในบางกรณีมันผิด! ถ้าฉันต้องการค้นหาsunยกเว้นเมื่อมีsunriseให้grep sun|grep -v sunriseข้ามบรรทัดที่มีทั้งสองsunและsunriseในคราวเดียวนั่นไม่ใช่สิ่งที่ฉันต้องการ grep -P 'sun(?!rise)'ดีกว่ามาก
กรีน

86

ฉันเข้าใจคำถามว่า "ฉันจะจับคู่คำอย่างไร แต่ไม่รวมคำอื่น" ซึ่งวิธีการหนึ่งคือสอง greps ในซีรีส์: grep แรกค้นหาคำที่ต้องการ "word1", grep ตัวที่สองยกเว้น "word2":

grep "word1" | grep -v "word2"

ในกรณีของฉัน: ฉันต้องแยกความแตกต่างระหว่าง "พล็อต" และ "#plot" ซึ่งตัวเลือก "คำ" ของ grep จะไม่ทำ ("#" ไม่ใช่ตัวอักษรและตัวเลข)

หวังว่านี่จะช่วยได้


16
word1คุณควรจะกลับคำสั่งที่จะได้รับการเน้นใน
แมทธิวอ่าน

1
ฉันเดาว่ามันจะชี้แจงให้เพิ่มตัวยึดตำแหน่งสำหรับชื่อไฟล์ในตัวอย่างนั้น
patrick

39

ถ้าคุณ grepรองรับการแสดงออกปกติ Perl ด้วย-Pตัวเลือกที่คุณสามารถทำได้ (ถ้าทุบตี; ถ้า tcsh คุณจะต้องหลบหนี!):

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

การสาธิต:

$ cat file
foo1
foo2
foo3
foo4
bar
baz

ให้เราแสดงรายการทั้งหมดfooยกเว้นfoo3

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

ขอบคุณสำหรับสิ่งนี้มีประโยชน์มาก! ฉันต้องการพูดถึงว่าคำสั่ง grep
คำนึงถึงขนาดตัวพิมพ์

2
โปรดทราบว่าgrep -v -Pยังใช้งานได้โดยไม่มีการปฏิเสธในนิพจน์ทั่วไป
cybersoft

"ถ้าทุบตี ... คุณจะต้องหลบหนี! " ขอบคุณขอบคุณขอบคุณ! นั่นคือสิ่งที่ฉันต้องการ!
Gabriel Staples

36

ทางออกที่ถูกต้องคือการใช้grep -v "word" fileโดยawkเทียบเท่ากับ:

awk '!/word/' file

อย่างไรก็ตามหากคุณมีสถานการณ์ที่ซับซ้อนกว่าที่คุณต้องการให้พูดXXXปรากฏและYYY ไม่ปรากฏให้เห็นแล้วawkมีประโยชน์มากกว่าการวางท่อหลายอันgrep:

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

คุณสามารถพูดอะไรที่ซับซ้อนกว่านี้ได้ ตัวอย่างเช่น: ฉันต้องการเส้นเหล่านั้นที่มีอย่างใดอย่างหนึ่งXXXหรือYYYแต่ไม่ใช่ZZZ:

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

เป็นต้น


2
ดูเหมือนว่าจะเร็วกว่าgrep -Pโซลูชันสำหรับไฟล์ขนาดใหญ่
MBR

@MBR grep -Pหมายถึงการใช้ Perl regexp grepเพื่อให้โหลดที่แพคเกจจะเป็นวิธีที่มีราคาแพงกว่าปกติ
fedorqui 'ดังนั้นหยุดทำอันตราย'


6

grep มีตัวเลือก '-v' หรือ '--invert-match' เพื่อเลือกบรรทัดที่ไม่ตรงกัน

เช่น

grep -v 'unwanted_pattern' file_name

สิ่งนี้จะส่งออกบรรทัดทั้งหมดจากไฟล์ file_name ซึ่งไม่มี 'ที่ไม่ต้องการ'

หากคุณกำลังค้นหารูปแบบในหลายไฟล์ภายในโฟลเดอร์คุณสามารถใช้ตัวเลือกการค้นหาแบบเรียกซ้ำดังนี้

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

grep ที่นี่จะพยายามแสดงรายการการเกิดขึ้นทั้งหมดของ 'wants_pattern' ในไฟล์ทั้งหมดจากภายในไดเรกทอรีปัจจุบันและส่งไปยัง grep ตัวที่สองเพื่อกรอง 'ที่ไม่ต้องการ _pattern' '|' - ไพพ์จะบอกเชลล์ให้เชื่อมต่อเอาต์พุตมาตรฐานของโปรแกรมด้านซ้าย (grep -r 'wants_pattern' *) กับอินพุตมาตรฐานของโปรแกรมที่ถูกต้อง (grep -v 'visible_pattern')


4

-vตัวเลือกที่จะแสดงให้คุณทุกสายที่ไม่ตรงกับรูปแบบ

grep -v ^unwanted_word

-5

ฉันเป็นไดเรกทอรีที่มีไฟล์จำนวนมาก ฉันต้องการค้นหาไฟล์ทั้งหมดที่ไม่มีสตริง "speedup" ดังนั้นฉันจึงใช้คำสั่งต่อไปนี้:

grep -iL speedup *

1
จากหน้า man: "-L, --files-without-match ยับยั้งเอาต์พุตปกติแทนที่จะพิมพ์ชื่อของไฟล์อินพุตแต่ละไฟล์ที่ไม่มีเอาต์พุตปกติที่จะพิมพ์ออกมา การสแกนจะหยุดในคู่แรก " (เน้น โดยฉัน) โปรดระวังสิ่งนี้!
xuiqzy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.