ฉันรู้ว่าhead
และtail
สามารถใช้-c
ตัวเลือกเพื่อระบุการชดเชยไบต์ ฉันกำลังมองหาวิธีที่จะแยกช่วงไบต์อย่างมีประสิทธิภาพจากไฟล์บันทึกขนาดใหญ่
ฉันรู้ว่าhead
และtail
สามารถใช้-c
ตัวเลือกเพื่อระบุการชดเชยไบต์ ฉันกำลังมองหาวิธีที่จะแยกช่วงไบต์อย่างมีประสิทธิภาพจากไฟล์บันทึกขนาดใหญ่
คำตอบ:
The DareDevil of the Unix สั่งdd
การช่วยเหลือ!
dd if=yourfile ibs=1 skip=200 count=100
นั่นจะเริ่มจากไบต์ 200 และแสดง 100 ไบต์ถัดไปหรือกล่าวอีกนัยหนึ่งไบต์ 200-300 ibs
หมายถึง dd อ่านครั้งละหนึ่งไบต์แทนที่จะเป็น 512 ไบต์เริ่มต้น แต่ยังคงเขียนออกเป็น 512 ไบต์เริ่มต้น ไปดูว่าibs
เป็นอันตรายต่อประสิทธิภาพการทำงานฉันหวังว่าไม่
หากความสนใจของคุณเป็นไบต์จะod
เป็นที่สนใจมากกว่า
-j, --skip-bytes=bytes
-N, --read-bytes=bytes
ดังนั้นการอ่าน 16 ไบต์เริ่มต้นที่ 1024 ไบต์และเอาท์พุทใน ascii
od -j 1024 -N 16 -a /bin/sh
คุณสามารถใช้dd if=logfile of=pieceoflogfile skip=startingblock count=#ofblocks
(อาจเป็นbs=1
ได้บล็อกหนึ่งไบต์มิฉะนั้นจะใช้บล็อก 512 ไบต์) ไม่แน่ใจว่ามีประสิทธิภาพแค่ไหนที่จะบอกให้เขียนทีละหนึ่งไบต์
dd
ของสามารถเชื่อมโยงท่อเข้าด้วยกัน (ที่ 1 อาจตัดชิ้นไขมันและที่ 2 จะทำงานได้ดีกว่าท่อไม่ใช่ดิสก์) แต่dd
ไม่เพียงbs
แต่แยกออกจากกันibs
และobs
เช่นกันที่ อย่างน้อยก็สามารถส่งออกด้วยบล็อกขนาดใหญ่กว่าการอ่าน
สมมติว่าไฟล์มีขนาดไม่ใหญ่เกินไป (เช่นหลาย GB หรือมากกว่านั้น) การวางท่อจากที่หนึ่งไปอีกที่หนึ่งจะมีประสิทธิภาพเท่ากับที่คุณได้รับโดยไม่ต้องเขียนโปรแกรมของคุณเอง
head ... file | tail ...
(หรือวิธีอื่น ๆ รอบไหนก็ได้)
time dd if=file.txt | wc -l
= 00: 00: 03stime dd if=file.txt ibs=1 count=782090815 | wc -l
= 9:05:19