grep ภายในน้อยลงหรือไม่


58

ขณะนี้ฉันกำลังตรวจสอบบันทึกที่ไม่คุ้นเคยจำนวนมากเพื่อค้นหาปัญหาบางอย่าง ไฟล์แรกที่ฉันดูคือ Events.log และฉันได้รับอย่างน้อยสามหน้าlessซึ่งดูเหมือนจะแสดงเหตุการณ์เดียวกันในเวลาที่ต่างกัน - เหตุการณ์ที่ดูเหมือนจะไม่เป็นธรรม ฉันต้องการที่จะกรองเหตุการณ์นี้ออกและตอนนี้ฉันออกlessและทำอะไรบางอย่างเช่น

grep -v "event text" Events.log | less

ตอนนี้นำเหตุการณ์ทั่วไปที่ไม่น่าสนใจอื่น ๆ จำนวนมากที่ฉันต้องการกรองออก มีวิธีที่ฉันสามารถgrep -v อยู่ข้างในของless? แทนที่จะต้องทำ

egrep -v "event text|something else|the other thing|foo|bar" Events.log | less

มันทำให้ฉันเป็นคุณลักษณะที่มีประโยชน์เมื่อดูแฟ้มบันทึกชนิดใด - และถ้าlessไม่ใช่เครื่องมือมีคุณสมบัติอื่นที่ฉันต้องการหรือไม่ เพียงแค่lessผู้ชมสไตล์ที่มีในgrepตัว

คำตอบ:


91

lessมีการจับคู่รูปแบบที่มีประสิทธิภาพมาก จากหน้าคน :

&pattern

    แสดงเฉพาะบรรทัดที่ตรงกับpattern; บรรทัดที่ไม่ตรงกับpattern จะไม่แสดง หากpatternว่างเปล่า (หากคุณพิมพ์&ตามด้วยทันทีENTER) การกรองใด ๆ จะถูกปิดและบรรทัดทั้งหมดจะปรากฏขึ้น ในขณะที่การกรองมีผลแอมเปอร์แซนด์จะปรากฏขึ้นที่จุดเริ่มต้นของพรอมต์เพื่อเตือนว่าบางบรรทัดในไฟล์อาจถูกซ่อน

    อักขระบางตัวมีความพิเศษใน/คำสั่ง :

    ^N หรือ !

      patternแสดงเส้นเดียวที่ไม่ตรงกับ
    ^R
      อย่าตีความ metacharacters นิพจน์ปกติ; นั่นคือทำการเปรียบเทียบข้อความอย่างง่าย

    ____________
    ตัวอักษรบางตัวเป็นพิเศษหากป้อนที่จุดเริ่มต้นของpattern; patternพวกเขาปรับเปลี่ยนประเภทของการค้นหาแทนที่จะกลายเป็นส่วนหนึ่งของ

   (แน่นอน^Nและ^Rเป็นตัวแทนของCtrl+ N และCtrl+ Rตามลำดับ) 

ตัวอย่างเช่น&dnsจะแสดงเฉพาะบรรทัดที่ตรงกับรูปแบบdnsและ&!dnsจะกรอง (ยกเว้น) บรรทัดเหล่านั้นโดยแสดงเฉพาะบรรทัดที่ไม่ตรงกับรูปแบบ

มันถูกบันทึกไว้ในคำอธิบายของ/คำสั่งว่า

    patternคือการแสดงออกปกติเป็นที่ยอมรับโดยห้องสมุดแสดงออกปกติที่จัดทำโดยระบบของคุณ

ดังนั้น

  • &eth[01]  จะแสดงบรรทัดที่มีeth0หรือeth1
  • &arp.*eth0จะแสดงบรรทัดที่มีarpตามด้วยeth0
  • &arp|dns  จะแสดงบรรทัดที่มีarpหรือdns

และ!สามารถคว่ำใด ๆ ข้างต้น ดังนั้นคำสั่งที่คุณต้องการใช้สำหรับตัวอย่างในคำถามของคุณคือ:

&!event text|something else|the other thing|foo|bar

ใช้และ เพื่อค้นหา (และ/ เพื่อไปยังถัดไป / ก่อนหน้า)/pattern?patternnN


1
นี่ใกล้จะถึงแล้ว! ในการlessใช้ '&! <1stpattern>' อนุญาตให้ฉัน 'ซ่อน' บรรทัดที่มีรูปแบบ แต่มันใช้กับรูปแบบเดียวเท่านั้นในแต่ละครั้งดังนั้นหากฉันพบรูปแบบที่สองและใช้ '&! <2ndpattern>' บรรทัดที่ตรงกับรูปแบบแรกและถูกซ่อนอยู่จะปรากฏให้เห็นแล้ว ใกล้มาก ๆ !
forquare

@forquare: มีประวัติคำสั่งที่คุณสามารถเข้าถึงได้ด้วยปุ่มลูกศรขึ้นและลง ดังนั้นกด&!แล้วกดปุ่มลูกศร
PM 2Ring

@forquare: และฉันก็ค้นพบว่าประวัติศาสตร์จะถูกบันทึกไว้เพื่อให้รูปแบบเก่าของคุณจะสามารถใช้ได้ในครั้งต่อไปที่คุณเรียกless; ฉันไม่รู้ว่ามันถูกเก็บรักษาไว้หลังจากรีบูตเครื่องหรือไม่
PM 2Ring

1
@orion นั่นเป็นบิตสุดท้ายที่ฉันหายไป - วิธีการเชื่อมรูปแบบเข้าด้วยกัน ฉันว่าฉันเคยลองใช้สัญลักษณ์ไพพ์มาก่อนแล้วและมันก็ล้มเหลว แต่ตอนนี้ฉันลองอีกครั้งมันใช้งานได้! ดังนั้น: &! <pattern1> | <pattern2> | <pattern3> จะลบบรรทัดที่มี pattern1 หรือ pattern2 หรือ pattern3
forquare

1
ฉันคิดออก Homebrew dupes มีเวอร์ชั่นล่าสุด ฉันเพิ่งจะเตะทุบตีเพราะมันไม่ได้คว้าไฟล์ที่ถูกต้อง (แม้ว่าที่บอกฉันว่ามันโลภ / ผู้ใช้ / ท้องถิ่น / ถัง / น้อย)
spinlock

7

อาคารในคำตอบของนายพรานที่less(1)หน้าคนอธิบาย

/pattern

    ค้นหาไปข้างหน้าในไฟล์สำหรับNบรรทัด -th patternมี  N เริ่มต้นที่ 1. patternคือการแสดงออกปกติเป็นที่ยอมรับโดยห้องสมุดแสดงออกปกติที่จัดทำโดยระบบของคุณ การค้นหาเริ่มต้นที่บรรทัดที่สองที่แสดง (แต่เห็น-aและ-jตัวเลือกซึ่งเปลี่ยนสิ่งนี้)

    อักขระบางตัวเป็นพิเศษหากป้อนที่จุดเริ่มต้นของpattern; พวกเขาปรับเปลี่ยนประเภทของการค้นหาแทนที่จะเป็นส่วนหนึ่งของpattern:

    ^N หรือ !

      patternค้นหาสำหรับสายที่ไม่ตรงกับ
    ^E หรือ *
      ค้นหาหลายไฟล์ นั่นคือถ้าการค้นหาถึงจุดสิ้นสุดของไฟล์ปัจจุบันโดยไม่พบการจับคู่การค้นหาจะดำเนินการต่อในไฟล์ถัดไปในรายการบรรทัดคำสั่ง
    ^F หรือ @
      เริ่มการค้นหาที่บรรทัดแรกของไฟล์ FIRST ในรายการบรรทัดคำสั่งโดยไม่คำนึงถึงสิ่งที่ปรากฏบนหน้าจอหรือการตั้งค่าของ-aหรือ-jตัวเลือกในปัจจุบัน
    ^K
      ไฮไลต์ข้อความใด ๆ ที่ตรงกับpatternบนหน้าจอปัจจุบัน แต่ไม่ย้ายไปที่การแข่งขันแรก (ตำแหน่งปัจจุบัน KEEP)
    ^R
      อย่าตีความ metacharacters นิพจน์ปกติ; นั่นคือทำการเปรียบเทียบข้อความอย่างง่าย

    ____________
    คำสั่งอาจนำหน้าด้วยตัวเลขทศนิยมที่เรียกว่าNในคำอธิบาย ...

   (แน่นอน^Nและ^Eฯลฯ เป็นตัวแทนของ Ctrl+ NและCtrl+ Eฯลฯ ) 

ปรากฎว่า และทำงานร่วมกันได้ดี ตัวอย่างเช่นคำสั่ง&pattern/pattern

  • &!arp|dnsEnter
  • /Ctrl+Kfail|fatal|fault|sd[a-z][0-9]Enter

พิมพ์ลงในคำสั่งอย่างใดอย่างหนึ่งจะซ่อน (ไม่รวม) ทุกสายที่มีarpหรือdns(ชอบgrep -v) และจากนั้นในบรรทัดที่เหลือไฮไลต์ที่เกิดขึ้นทั้งหมดfail, fatal, faultหรืออะไรที่ดูเหมือนว่าชื่อของอุปกรณ์ SCSI (ที่sd[a-z][0-9]) โปรดทราบว่าบรรทัดที่มีarpหรือหรือdnsและยังfailหรือคำอันตรายอื่น ๆ จะไม่ปรากฏ


2

fzfในช่วงไม่กี่เดือนที่ผ่านมาผมได้กลายเป็นส่วนหนึ่งของติดใจ

ในกรณีของคุณตราบใดที่บริบทไม่จำเป็นต้อง (เช่นเทียบเท่า grep ของ-A, -Bหรือ-Cไม่จำเป็นและโดยวิธีการที่น้อย&นอกจากนี้ยังมีข้อ จำกัด เหมือนกัน) แล้ว fzf เป็นเครื่องมือที่มีประสิทธิภาพมาก

นี่เป็นตัวอย่างที่ไร้สาระ:

printf "%s\n" {aa,bb,cc}{dd,ee,ff}{gg,hh,ii} | fzf

หากคุณเรียกใช้และเล่นกับอินพุตเช่นaa | bb dd | ee !gg !hhและอื่น ๆ คุณจะเห็นสิ่งที่เกิดขึ้นอย่างรวดเร็ว

เอกสารของ Fzf เกี่ยวกับ|ตัวดำเนินการนั้นกระจัดกระจาย แต่สิ่งที่ฉันคาดเดาได้ดีที่สุดก็คือมันใช้เฉพาะกับข้อกำหนดทันทีก่อนและหลังซึ่งหมายความว่า OR จะมีความสำคัญเหนือกว่าและ (ซึ่งโดยนัยคือเงื่อนไขทั้งหมดเป็น AND-ed โดยค่าเริ่มต้น) . แต่ในกรณีส่วนใหญ่สิ่งนี้ไม่ควรเป็นปัญหาและสิ่งต่าง ๆ ใช้ได้ในประสบการณ์ของฉัน

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

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