แถบความคืบหน้าของ Grep โดยใช้ pv (ไปป์)


11

ฉันมีไดเรคทอรีขนาดใหญ่บนคอมพิวเตอร์ของฉันและฉันต้องการค้นหาไฟล์ทับทิมทุกอันในสตริง

ฉันทำได้เช่นนี้grep -R "string" *.rbแต่ใช้เวลานานมากและฉันต้องการใช้ pv (ไปป์) เพื่อแสดงแถบความคืบหน้าเพื่อให้สามารถติดตามgrepความคืบหน้าได้

แต่ฉันไม่รู้จริง ๆ ว่าฉันจะเขียนคำสั่งนี้ได้อย่างไรเพราะยังมีบางสิ่งที่ฉันไม่เข้าใจเกี่ยวกับคำสั่งนี้

มีใครมีความคิดบ้างไหม?

คำตอบ:


15

pvทำงานบนไพพ์ (ไม่ใช่คำสั่ง) - เป็นเกจวัดระดับเสียงที่แสดงว่าข้อมูลผ่านจุดที่กำหนดในไพพ์ไลน์ไปมากน้อยเพียงใด
คำสั่ง grep ของคุณคือไม่ได้ท่อ ( |- The pipe operatorที่ไหนเลยที่จะพบได้) - เป็นเพียงคำสั่งเดียวทำสิ่งที่ตน pvไม่สามารถช่วยคุณได้ที่นี่คุณเพียงแค่ต้องเชื่อใจว่าgrepกำลังทำสิ่งนั้นกับไฟล์อินพุตทั้งหมด

คุณสามารถทำอะไรบางอย่างร่วมกับ find, pv, xargs & grep ( find . -name "*.rb" | pv | xargs grep [regex]ดูเหมือนว่ามันอาจจะเป็นสัญญา แต่คุณจะต้องบอกpvว่าการfindส่งออกมีขนาดใหญ่เพื่อให้ผลลัพธ์ที่มีความหมาย

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


1
มันแน่นอนเป็นไปได้ก็ซับซ้อนเพียงและอาจจะใช้เวลานานกว่าที่จะใส่กันและได้รับการทำงานมากกว่าเพียงแค่การรอคอยสำหรับ grep ให้เสร็จ :-)
voretaq7

1
อาจเป็นตัวอย่างที่ดีจริงๆ: p
Cydonia7

4

อีกสองวิธี:

for file in *.rb; do echo $file; grep "string" $file >> output.txt; done

หรือในเชลล์ที่ต่างออกไปในขณะที่คำสั่งดั้งเดิมของคุณกำลังรันอยู่ให้ค้นหา pid ของคำสั่ง grep จากนั้น:

strace -q -s 256 -e trace=open -p [pid] 2>&1 | head

ทั้งสองข้อด้านบนจะแสดงไฟล์ที่คำสั่ง grep กำลังทำงานอยู่ คุณสามารถค้นหาจำนวนไฟล์ทั้งหมดด้วย:

ls -l *.rb | wc -l

ท้ายสุดใช้สิ่งนี้เพื่อหาว่าไฟล์ปัจจุบันมีจำนวนเท่าใดในรายการ:

ls -l *.rb | grep -n [the current filename]

PS คำตอบของฉันคิดว่าไฟล์ทั้งหมดของคุณอยู่ในไดเรกทอรีเดียว หากพวกเขาไม่ใช่คุณจะต้องใช้findแทนlsและ*.rbเป็น thinice แนะนำ


1
นั่นเป็นทางเลือกที่ดี
Cydonia7

1

ฉันไม่แน่ใจว่าคุณใช้ระบบปฏิบัติการอะไร แต่grep -R "string" *.extอาจทำงานไม่ถูกต้องสำหรับคุณ

คุณอาจได้รับบริการที่ดีขึ้นเมื่อใช้findร่วมกับgrep:

find . -type f -name "*.rb" -print0 |xargs --null grep "string"


ใช่แล้วคำสั่งที่ฉันให้ใช้กับ Fedora 16 ได้จริง แต่ก็ชัดเจนกว่า ขอบคุณ !
Cydonia7

1

ในรุ่นล่าสุดpvมี"-d"-Option เพื่อดู FDs ทั้งหมดของกระบวนการอื่น

ดังนั้นในทางทฤษฎีpvจะไม่เพียง แต่ทำงานเป็นไพพ์เท่านั้น แต่ยังเป็นตัวบ่งชี้ความก้าวหน้าสำหรับกระบวนการทั้งหมด (ตัวอย่างเช่นลองด้วย PID ของ Firefox ของคุณ)

สำหรับปัญหาดังกล่าวข้างต้นเป็นความคิดที่เรียบง่ายต่อไปนี้: ในขณะที่grepกำลังเรียกใช้ร่วมกับlsofwatch

$ watch -n 1 "lsof | grep -n $PWD"

ด้วยวิธีนี้คุณสามารถติดตามความคืบหน้าของ grep ของคุณ


0

คุณได้ลองแล้ว

grep -R "string" *.rb | pv

ฉันไม่รู้ว่ามันใช้งานได้จริงหรือไม่เพราะไม่รู้ว่าจะค้นหาข้อมูลทั้งหมดกี่บิตเพราะซ้ำแล้วซ้ำอีก


4
ฉันไม่คิดว่าสิ่งนี้จะทำในสิ่งที่เขาต้องการ - pvจะทำงานบนเอาต์พุตของ grep (ดังนั้นแม้ว่าเขาจะระบุขนาดอินพุตแบบเต็มpvเท่านั้นจะเห็นผลลัพธ์ที่ออกมาจากปลายท่อ - มันจะเป็นไปตามวิธีการ - นับจำนวนไบต์
voretaq7

0

ฉันมักจะใช้ระบบไฟล์ proc บนระบบ Linux เช่น

ls -al /proc/<pid of grep>/fd

รายการนี้แสดงไฟล์ทั้งหมดที่ grep-invocation เปิดขึ้นในขณะนี้และจะให้ความประทับใจว่าอยู่ที่ไหนในการค้นหา

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