grep พร้อมตัวดำเนินการเชิงตรรกะ


19

มียูทิลิตี grep คล้ายหรือไม่ซึ่งจะทำให้ฉันสามารถค้นหา grep ด้วยตัวดำเนินการทางตรรกะได้ ฉันต้องการที่จะสามารถซ้อนและรวมโครงสร้างเชิงตรรกะได้อย่างอิสระ ตัวอย่างเช่นสิ่งนี้ควรเป็นไปได้:

grep (term1 && term2) || (term1 && (term3 xor term4)) *

ฉันรู้ว่าสิ่งนี้สามารถทำได้ด้วยวานิลลา grep และการเขียนสคริปต์ทุบตีเพิ่มเติม แต่เป้าหมายของฉันที่นี่คือหลีกเลี่ยงการทำเช่นนั้น

grep 

คำตอบ:


12

ด้วยawkเช่นเดียวกับperlคุณจะต้องใส่คำศัพท์ลง//ไป แต่ก็สามารถทำได้:

awk '(/term1/ && /term2/) || (/term1/ && xor(/term3/, /term4/))' 

28

มีหลายวิธีที่จะใช้grepกับตัวดำเนินการเชิงตรรกะ

  1. ใช้ \|เพื่อแยกหลายรูปแบบสำหรับเงื่อนไขOR

    ตัวอย่าง: grep 'pattern1\|pattern2' filename

  2. ใช้-Eตัวเลือกเพื่อส่งหลายรูปแบบสำหรับ เงื่อนไขOR

    ตัวอย่าง: grep -E 'pattern1|pattern2' filename

  3. การใช้การ-eจับคู่เดียวเพียงหนึ่งรูปแบบ แต่การใช้หลาย -eตัวเลือกจับคู่มากกว่าหนึ่งรูปแบบ

    ตัวอย่าง: grep -e pattern1 -e pattern2 filename

  4. grep -vสามารถจำลองการดำเนินการไม่ได้

  5. ไม่มีและผู้ประกอบการในgrepแต่คุณสามารถแรงเดรัจฉานจำลองและโดยใช้-Eตัวเลือก

    ตัวอย่าง: grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename

    ตัวอย่างข้างต้นจะจับคู่ทุกบรรทัดที่มีทั้ง pattern1และpattern2ตามลำดับ)


1
-Eไม่เทียบเท่า&&เนื่องจากความจริงที่ว่ามันมีความอ่อนไหวต่อคำสั่ง
iruvar

grep foo | grep barเป็นวิธีทั่วไปที่ต้องทำและ
Kenster

2
+1 สำหรับการอธิบายอย่างชัดเจนว่าไม่มีตัวดำเนินการ "AND" ที่แท้จริงและสิ่งที่ดีที่สุดที่เราทำได้คือจำลองการแฮ็คโดยใช้โครงสร้าง OR แน่นอนว่าสิ่งนี้จะได้รับความเทอะทะเกิน 3 เทอม แต่สำหรับสองเทอมมันใช้ได้ดี
Eric Hepperle - CodeSlayer2010

grep -c -e MATCH1 -e MATCH2 ยอดเยี่ยมเมื่อคุณสนใจในการนับชื่อไฟล์
andrej


0
sed '/term1/!d;/term2/b' -e '/term3/!d;/term4/d' *

ฉันเชื่อว่าบรรลุสิ่งที่คุณกำลังพยายามทำ มันจะdลบออกจากบรรทัดใด ๆ ที่ไม่ตรงกันterm1โดยจะลบbออกจากสคริปต์(และพิมพ์อัตโนมัติ)บรรทัดใด ๆ ที่ยังคงอยู่และตรงกับterm2นั้นและสำหรับบรรทัดที่เหลืออยู่จะลบสิ่งterm3ใดที่ไม่ตรงกันterm4.

sed สคริปต์จะถูกประเมินตามลำดับและการทดสอบทั้งหมดเป็นบูลีนดังนั้นการกระทำใด ๆ ที่เกิดจากการทดสอบจะส่งผลโดยตรงต่อพฤติกรรมของการกระทำดังต่อไปนี้


0

ฉันใช้โซ่grepคำสั่งเพื่อให้บรรลุตรรกะและ:

grep expr1 filename | grep expr2

ฉันเชื่อว่ามันตรงไปตรงมาสวยเหมือนยูนิกซ์และสง่างาม


จากนั้นคุณสามารถรวม (ตามที่ @Tushi อธิบายอย่างละเอียด) ด้วย-Eตัวเลือกสำหรับ OR-ing และ-vสำหรับการปฏิเสธ

ตัวอย่างที่เฉพาะเจาะจงของคุณค่อนข้างน่ารังเกียจและอาจได้รับประโยชน์จากยูทิลิตี้ที่มีประสิทธิภาพมากขึ้น (ดูคำตอบของ @ muru)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.