คำตอบ:
คุณสามารถทำได้โดยใช้-v
(สำหรับ--invert-match
) ตัวเลือกของ grep เป็น:
grep -v "unwanted_word" file | grep XXXXXXXX
grep -v "unwanted_word" file
จะกรองสายที่มีunwanted_word
และจะแสดงเพียงเส้นที่มีรูปแบบgrep XXXXXXXX
XXXXXXXX
แก้ไข:
unwanted_word
จากความคิดเห็นของคุณดูเหมือนว่าคุณต้องการที่จะแสดงรายการทุกสายได้โดยไม่ต้อง ในกรณีที่คุณต้องการคือ:
grep -v 'unwanted_word' file
-v 'unwanted_word' --after N
ไม่ช่วยเพราะมันรวมถึงบรรทัดและบรรทัด N หลัง
-v
หรือ--invert-match
เลือกบรรทัดที่ไม่ตรงกัน ในกรณีของคุณหรือgrep -v 'unwanted_word' file
grep --invert-match 'unwanted_word' file
git status -s |grep -v "folder_I_dont_care"
sun
ยกเว้นเมื่อมีsunrise
ให้grep sun|grep -v sunrise
ข้ามบรรทัดที่มีทั้งสองsun
และsunrise
ในคราวเดียวนั่นไม่ใช่สิ่งที่ฉันต้องการ grep -P 'sun(?!rise)'
ดีกว่ามาก
ฉันเข้าใจคำถามว่า "ฉันจะจับคู่คำอย่างไร แต่ไม่รวมคำอื่น" ซึ่งวิธีการหนึ่งคือสอง greps ในซีรีส์: grep แรกค้นหาคำที่ต้องการ "word1", grep ตัวที่สองยกเว้น "word2":
grep "word1" | grep -v "word2"
ในกรณีของฉัน: ฉันต้องแยกความแตกต่างระหว่าง "พล็อต" และ "#plot" ซึ่งตัวเลือก "คำ" ของ grep จะไม่ทำ ("#" ไม่ใช่ตัวอักษรและตัวเลข)
หวังว่านี่จะช่วยได้
word1
คุณควรจะกลับคำสั่งที่จะได้รับการเน้นใน
ถ้าคุณ 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 -v -P
ยังใช้งานได้โดยไม่มีการปฏิเสธในนิพจน์ทั่วไป
!
" ขอบคุณขอบคุณขอบคุณ! นั่นคือสิ่งที่ฉันต้องการ!
ทางออกที่ถูกต้องคือการใช้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
เป็นต้น
grep -P
โซลูชันสำหรับไฟล์ขนาดใหญ่
grep -P
หมายถึงการใช้ Perl regexp grep
เพื่อให้โหลดที่แพคเกจจะเป็นวิธีที่มีราคาแพงกว่าปกติ
สลับการจับคู่โดยใช้ grep -v:
grep -v "unwanted word" file pattern
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')
-v
ตัวเลือกที่จะแสดงให้คุณทุกสายที่ไม่ตรงกับรูปแบบ
grep -v ^unwanted_word
ฉันเป็นไดเรกทอรีที่มีไฟล์จำนวนมาก ฉันต้องการค้นหาไฟล์ทั้งหมดที่ไม่มีสตริง "speedup" ดังนั้นฉันจึงใช้คำสั่งต่อไปนี้:
grep -iL speedup *
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"