การใช้ดัชนีเพื่อทำให้ grep เร็วขึ้น?


10

ฉันพบว่าตัวเอง grepping codebase เดียวกันซ้ำแล้วซ้ำอีก ในขณะที่ใช้งานได้ดีแต่ละคำสั่งใช้เวลาประมาณ 10 วินาทีดังนั้นฉันจึงคิดว่าจะทำให้เร็วขึ้นได้อย่างไร

ดังนั้นสามารถgrepใช้ดัชนีบางประเภทได้หรือไม่? ฉันเข้าใจว่าดัชนีอาจไม่ช่วยให้ regexps ที่ซับซ้อน แต่ฉันใช้ patters ง่าย ๆ ส่วนใหญ่ มีตัวสร้างดัชนีสำหรับกรณีนี้หรือไม่?

แก้ไข: ฉันรู้เกี่ยวกับ ctags และชอบ แต่ฉันต้องการค้นหาข้อความแบบเต็ม


คุณใช้ oprtion แบบเรียกซ้ำสำหรับ grep หรือ find / xargs บางอย่างเหมือนกันไหม?
MichałŠrajer

@ Michał: ใช่ -R
Peltier

คำตอบ:


4

สิ่งที่เกี่ยวกับcscopeสิ่งนี้ตรงกับรองเท้าของคุณหรือไม่

อนุญาตให้ค้นหารหัสสำหรับ:

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

นั่นอาจเป็นสิ่งที่ฉันกำลังมองหาฉันจะดู ขอบคุณ!
Peltier

ดูเหมือนว่าจะใช้งานได้ดีสำหรับ C อาจ C ++ และ Java
neves

4

การจัดทำดัชนีข้อความแบบเต็ม

มีเครื่องมือต่าง ๆ เช่นrecoll , swish-eและsphinxแต่คุณต้องตรวจสอบว่าพวกเขาสามารถรองรับเกณฑ์การค้นหาที่คุณต้องการหรือไม่

Recoll

Recoll เป็นเครื่องมือค้นหาข้อความแบบเต็มส่วนบุคคลสำหรับ Unix / Linux

หวด-E

Swish-e เป็นระบบโอเพ่นซอร์สที่รวดเร็วยืดหยุ่นและฟรีสำหรับการจัดทำดัชนีคอลเลกชันของเว็บเพจหรือไฟล์อื่น ๆ

บุคคลลึกลับ

สฟิงซ์ช่วยให้คุณสามารถจัดทำดัชนีแบตช์และค้นหาข้อมูลที่เก็บไว้ในฐานข้อมูล SQL ที่เก็บข้อมูล NoSQL หรือเพียงแค่ไฟล์อย่างรวดเร็วและง่ายดาย

grep

ฉันประหลาดใจ grep ช้าตามที่คุณอธิบายคุณสามารถลดจำนวนไฟล์ที่ค้นหาได้หรือไม่? ตัวอย่างเช่นเมื่อฉันต้องการค้นหาไฟล์ซอร์สสำหรับไฟล์เรียกทำงานหนึ่งไฟล์ (จากหลายไฟล์ในโปรเจ็กต์) ฉันป้อน grep ชื่อจากคำสั่งที่แสดงรายการซอร์สไฟล์สำหรับโปรแกรมนั้น:

grep expression `sources myprogram`

sources เป็นโปรแกรมเฉพาะสำหรับสภาพแวดล้อมการพัฒนาของฉัน แต่คุณอาจมี (หรือสามารถสร้าง) บางสิ่งที่เทียบเท่า

ฉันสมมติว่าคุณได้ลองใช้เทคนิคที่ชัดเจนเช่น

find /foo/myproject -name "*.c" -exec fgrep -l searchtext

ฉันได้อ่านคำแนะนำว่า-Pตัวเลือกปัจจุบันgrepสามารถเพิ่มความเร็วในการค้นหาได้อย่างมาก


1
AFAIK locate ใช้สำหรับชื่อไฟล์เท่านั้น recoll จะทำงานได้ แต่ฉันต้องการเครื่องมือบรรทัดคำสั่ง รหัสฐานมีขนาดใหญ่มากและเนื่องจากฉันกำลังมองหาสตริงฉันไม่รู้ว่ามันอยู่ที่ไหนดังนั้นจึงเป็นการยากที่จะ จำกัด จำนวนไฟล์ที่จะค้นหา :)
Peltier

ฉันคิดว่า swish-e เป็นบรรทัดคำสั่ง ฉันไม่ได้ลองเลย (grep เร็วพอสำหรับโปรเจคของฉัน)
RedGrittyBrick

3

grep, no. แต่มีหลายโปรแกรมที่ใช้ดัชนีและมุ่งเป้าไปที่รหัสฐาน ctags(มีรุ่นที่ให้บริการเป็นกลุ่ม), etags(มีจุดประสงค์เพื่อใช้กับ emacs), global(เป็นอิสระจากโปรแกรมแก้ไขเพิ่มเติม) เป็นรุ่นที่ฉันกำลังคิดเกี่ยวกับตอนนี้ แต่อาจมีคนอื่น ๆ


ฉันใช้ ctags แต่ไม่ จำกัด เพียงการค้นหาชื่อฟังก์ชั่น? ฉันต้องการค้นหาข้อความแบบเต็ม
Peltier

ฉันค่อนข้างมั่นใจว่า ctag ยังสามารถค้นหาคำจำกัดความของชั้นเรียนและ ISTR ที่พบการใช้งานบางอย่าง ฉันแน่ใจว่าทั่วโลกทำทั้งสองอย่าง แต่มันเป็นความจริงที่เครื่องมือเหล่านั้นไม่ทำการค้นหาข้อความแบบเต็มและใช้ความรู้ด้านภาษาเพื่อ จำกัด ขอบเขตของพวกเขา
AProgrammer


2

ถ้าคุณต้องการใช้เสิร์ชเอ็นจิ้นแบบ fulltext .. ให้ใช้อันใดอันหนึ่ง:


เป็นตัวเลือกเสมอ แต่ฉันสงสัยว่ามีตัวเลือกการเร่งความเร็ว grep ที่เบาขึ้นเร็วขึ้นและสกปรกมากขึ้นหรือไม่
Peltier

'เบากว่า' แต่ 'ต้องการให้ดัชนีของฉันเต็ม' เป็นบิตของ 2 สุดขีด :) ctags เป็นคู่ที่ดีที่สุดสำหรับสิ่งที่คุณต้องการถ้าคุณแค่อยากสกปรกเร็ว กับทุกสิ่งที่คุณจบลงด้วยการใช้ fulltext-search-engine เช่น "เรียกคืน" ที่กล่าวถึงใน @RedGrittyBrick คำตอบใช้ xapian เป็นส่วนหลัง
กิระ

1
พวกเขาไม่จำเป็นต้องเข้ากันไม่ได้ ลองนึกภาพว่า ctags มีตัวเลือก --full-text และ grep a - ตัวเลือก -tag-file แน่นอนความจริงที่ว่ามันอาจจะอยู่ไม่ได้หมายความว่ามันไม่ :)
Peltier

-1

ไม่ฉันไม่คิดอย่างนั้น แต่อาจมีวิธีแก้ปัญหาง่ายๆ: ลองใช้ ack ฉันคิดว่าถ้าคุณให้โอกาสคุณจะพบว่าเร็วกว่า grep มากต้องการสตริงการค้นหาที่สั้นกว่าเพื่อให้ได้ผลลัพธ์การค้นหาที่ดีขึ้นและมีคุณสมบัติที่ต้องการมากมายในขณะที่ใช้สวิตช์คำสั่งเดียวกัน สิ่งหนึ่งที่ทำให้เร็วขึ้น (แม้ว่าจะไม่ได้จัดทำดัชนี) คือมันไม่สนใจสิ่งที่คุณไม่ต้องการค้นหามากขึ้น มันเขียนใน Perl และใช้การแสดงออกปกติของ Perl (และยังมีพอร์ต Mac และ Windows ด้วย)

http://betterthangrep.com/


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