ยกเว้นไฟล์ที่มีบรรทัดข้อความที่ยาวมากจากเอาต์พุต grep


18

ฉันมักจะรันคำสั่ง grep เพื่อค้นหาสิ่งต่าง ๆ ในรหัสของฉัน แต่ปัญหาเกี่ยวกับโปรเจ็กต์ทางเว็บคือมักจะมีไฟล์ JavaScript และ CSS ที่บีบอัดซึ่งสร้างข้อความขนาดใหญ่หนึ่งบรรทัดดังนั้นหากพบคู่ที่ตรงกันหน้าต่างเทอร์มินัลทั้งหมดคือ เต็มไปมากกว่า 1,000 บรรทัดทำให้ไม่สามารถค้นหาสิ่งที่ฉันกำลังมองหาได้

ดังนั้นมีวิธีหลีกเลี่ยงไฟล์ที่พูดข้อความบรรทัดเดียวมากกว่า 200 ตัวอักษรหรือไม่

คำตอบ:


20

ด้วย GNU grep และ xargs:

grep -rLZE '.{200}' . | xargs -r0 grep pattern

อีกวิธีหนึ่งคุณสามารถตัดการส่งออกของ grep:

grep -r pattern . | cut -c1-"$COLUMNS"

หรือแจ้งให้เทอร์มินัลของคุณไม่ห่อข้อความหากมันรองรับ:

tput rmam
grep -r pattern .

หรือใช้ less -S

grep -r pattern . | less -S

3
การใช้ regex จากตัวอย่างแรกของคุณ, pip ไปที่ grep กับ invert match, ... | grep -v -E '.{200}'ก็ใช้ได้เหมือนกัน เช่นเพื่อค้นหาบรรทัดทั้งหมดของไฟล์ * .js ภายใต้ dir ปัจจุบันด้วย ".name" ในไฟล์ที่มีความยาวไม่เกิน 200 ตัวอักษร: find . -name "*.js" -exec grep -H \\.name {} \; | grep -v -E '.{200}'
Gary S. Weaver

3

ตัวเลือก 1: คุณสามารถยกเว้นไฟล์ที่ตรงกับรูปแบบที่กำหนด:

grep --exclude='*.min.*'

ตัวเลือกนี้จะยกเว้นscript.min.jsและstyle.min.css... grepตัวเลือกอื่นรวมถึง--exclude-from=FILEและ--exclude-dir=DIR

ตัวเลือกที่ 2: ผมไม่แน่ใจว่านี้เป็นจริง แต่คุณสามารถcut200 ตัวอักษรแรกของแต่ละบรรทัดและจากนั้นgrepพวกเขา

grep -H [OPTIONS] PATTERN [FILE...] | cut -c1-200 | grep PATTERN

สิ่งแรกgrepคือการจับคู่เริ่มต้นและส่งออกชื่อไฟล์และบรรทัดส่วนที่สองรับรองว่าPATTERNยังคงอยู่ที่นั่นหลังจากcutทิ้งบรรทัด


2

ในสถานการณ์แบบนี้ฉันชอบที่จะ grep รูปแบบที่มีบริบทพื้นที่ใกล้เคียง (สมมติว่า 30 ตัวอักษร):

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