คำสั่ง Linux เพื่อดึงข้อมูลช่วงไบต์จากไฟล์


15

ฉันรู้ว่าheadและtailสามารถใช้-cตัวเลือกเพื่อระบุการชดเชยไบต์ ฉันกำลังมองหาวิธีที่จะแยกช่วงไบต์อย่างมีประสิทธิภาพจากไฟล์บันทึกขนาดใหญ่

คำตอบ:


17

The DareDevil of the Unix สั่งddการช่วยเหลือ!

dd if=yourfile ibs=1 skip=200 count=100

นั่นจะเริ่มจากไบต์ 200 และแสดง 100 ไบต์ถัดไปหรือกล่าวอีกนัยหนึ่งไบต์ 200-300 ibsหมายถึง dd อ่านครั้งละหนึ่งไบต์แทนที่จะเป็น 512 ไบต์เริ่มต้น แต่ยังคงเขียนออกเป็น 512 ไบต์เริ่มต้น ไปดูว่าibsเป็นอันตรายต่อประสิทธิภาพการทำงานฉันหวังว่าไม่


สำหรับไฟล์ 782090815 ไบต์ฉันได้รับสิ่งเหล่านี้: time dd if=file.txt | wc -l= 00: 00: 03s time dd if=file.txt ibs=1 count=782090815 | wc -l= 9:05:19
Danilo Souza Morães

11

หากความสนใจของคุณเป็นไบต์จะodเป็นที่สนใจมากกว่า

-j, --skip-bytes=bytes
-N, --read-bytes=bytes

ดังนั้นการอ่าน 16 ไบต์เริ่มต้นที่ 1024 ไบต์และเอาท์พุทใน ascii

od -j 1024 -N 16 -a /bin/sh

4

คุณสามารถใช้dd if=logfile of=pieceoflogfile skip=startingblock count=#ofblocks(อาจเป็นbs=1ได้บล็อกหนึ่งไบต์มิฉะนั้นจะใช้บล็อก 512 ไบต์) ไม่แน่ใจว่ามีประสิทธิภาพแค่ไหนที่จะบอกให้เขียนทีละหนึ่งไบต์


ถ้ากังวลเกี่ยวกับประสิทธิภาพ - 2 ddของสามารถเชื่อมโยงท่อเข้าด้วยกัน (ที่ 1 อาจตัดชิ้นไขมันและที่ 2 จะทำงานได้ดีกว่าท่อไม่ใช่ดิสก์) แต่ddไม่เพียงbsแต่แยกออกจากกันibsและobsเช่นกันที่ อย่างน้อยก็สามารถส่งออกด้วยบล็อกขนาดใหญ่กว่าการอ่าน
poige

1

สมมติว่าไฟล์มีขนาดไม่ใหญ่เกินไป (เช่นหลาย GB หรือมากกว่านั้น) การวางท่อจากที่หนึ่งไปอีกที่หนึ่งจะมีประสิทธิภาพเท่ากับที่คุณได้รับโดยไม่ต้องเขียนโปรแกรมของคุณเอง

head ... file | tail ...

(หรือวิธีอื่น ๆ รอบไหนก็ได้)


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