grep
ค้นหาบรรทัดที่ตรงกับรูปแบบ เพื่อให้มันต้องโหลดหนึ่งบรรทัดในเวลาในหน่วยความจำ GNU grep
ซึ่งแตกต่างจากgrep
การใช้งานอื่น ๆไม่ได้ จำกัด ขนาดของบรรทัดที่อ่านและรองรับการค้นหาในไฟล์ไบนารี ดังนั้นถ้าคุณมีไฟล์ที่มีเส้นใหญ่มาก (นั่นคือมีอักขระขึ้นบรรทัดใหม่สองตัวที่อยู่ไกลมาก) ซึ่งใหญ่กว่าหน่วยความจำที่มีอยู่มันจะล้มเหลว
ที่มักจะเกิดขึ้นกับไฟล์ที่กระจัดกระจาย คุณสามารถทำซ้ำได้ด้วย:
truncate -s200G some-file
grep foo some-file
อันนี้ยากที่จะแก้ไข คุณสามารถทำมันเป็น (ยังกับ GNU grep
):
find ~/Documents -type f -exec sh -c 'for i do
tr -s "\0" "\n" < "$i" | grep --label="$i" -He "$0"
done' Milledgeville {} +
ที่แปลงลำดับของตัวละคร NUL grep
เป็นตัวอักษรขึ้นบรรทัดใหม่หนึ่งก่อนที่จะมีการให้อาหารป้อนข้อมูลไปยัง ที่จะครอบคลุมในกรณีที่ปัญหาเกิดจากไฟล์กระจัดกระจาย
คุณสามารถปรับให้เหมาะสมด้วยการทำเพื่อไฟล์ขนาดใหญ่เท่านั้น:
find ~/Documents -type f \( -size -100M -exec \
grep -He Milledgeville {} + -o -exec sh -c 'for i do
tr -s "\0" "\n" < "$i" | grep --label="$i" -He "$0"
done' Milledgeville {} + \)
หากไฟล์ไม่กระจัดกระจายและคุณมี GNU รุ่นgrep
ก่อนหน้า2.6
คุณสามารถใช้--mmap
ตัวเลือก บรรทัดจะถูก mmapped ในหน่วยความจำซึ่งตรงข้ามกับการคัดลอกที่นั่นซึ่งหมายความว่าระบบสามารถเรียกคืนหน่วยความจำได้เสมอโดยการเพจออกไปยังไฟล์ ตัวเลือกนั้นถูกลบใน GNU grep
2.6