파일 내에서 단일 바이트 청크를 어떻게 추출합니까?


81

Linux 데스크톱 (RHEL4)에서 대용량 파일 (> 1Gig) 내에서 바이트 범위 (일반적으로 1000 미만)를 추출하려고합니다. 파일의 오프셋과 청크의 크기를 알고 있습니다.

이 작업을 수행하는 코드를 작성할 수 있지만 명령 줄 솔루션이 있습니까?

이상적으로는 다음과 같습니다.

magicprogram --offset 102567 --size 253 < input.binary > output.binary

답변:


121

시도해보십시오 dd:

dd skip=102567 count=253 if=input.binary of=output.binary bs=1

2
선택적으로 추가 status=none하여 stderr 로의 출력을 억제합니다.
kenorb

13
다음은 16 진 오프셋을 사용하는 예 dd if=in.bin bs=1 status=none skip=$((0x88)) count=$((0x80)) of=out.bin입니다..
kenorb

@kenorb : 16 진수 구문이 Bash의 일부라고 생각하므로 다른 셸에서 반드시 작동하는 것은 아닙니다. 나는 나 자신이 tcsh를 사용하고 (나를 때리지 마십시오!) 당신의 예제는 거기에서 작동하지 않습니다.
Thomas Padron-McCarthy 2015

1
bs = 1 및 count = 253을 사용하고 그 반대가 아닌 특별한 이유가 있습니까? 더 큰 블록 크기가 명령을 더 효율적으로 만들까요?
렉스 포드

1
@rexford : 건너 뛰기 번호도 블록 단위로 제공되며 253의 배수가 아닙니다. OS가 파일 시스템의 일반 파일에서 읽을 때 자체 버퍼링을 수행한다는 점을 감안할 때이 경우 효율성은 장치에서 읽을 때.
Thomas Padron-McCarthy

55

이것은 오래된 질문이지만 dd큰 바이트 청크에 더 적합한 다른 버전의 명령 을 추가하고 싶습니다 .

dd if=input.binary of=output.binary skip=$offset count=$bytes iflag=skip_bytes,count_bytes 

어디 $offset$bytes바이트 단위의 번호입니다.

Thomas의 대답과 다른 점 bs=1은 여기에 나타나지 않는다는 것입니다. bs=1입력 및 출력 블록 크기를 1 바이트로 생성하므로 추출 할 바이트 수가 많을 때 속도가 매우 느려집니다.


4
이것은 실제로 내 대답보다 훨씬 빠릅니다.
Thomas Padron-McCarthy

1
Mac에서 작동하지 않음- iflag알 수없는 피연산자이며 그것 없이는 전체 블록을 얻습니다.
Timmmm

1
@Timmmm GNU ddiflag지원에 사용할 수 있습니다 ( brew install coreutils). 참고 : 기본적으로 유틸리티는 g접두어 로 설치됩니다 (예 : gdd대신 dd)
Shakil

속도 향상을위한 완벽한 트릭, 나는 48 기가 바이트 파일을 분할 거라고이 내 인생 저장
알리 Nadalizadeh을

11

head -c + tail -c

dd효율성과 비교하면 확실하지 않지만 재미 있습니다.

printf "123456789" | tail -c+2 | head -c3

두 번째부터 시작하여 3 바이트를 선택합니다.

234

참조 : https://stackoverflow.com/a/1272995/895245


@ elvis.dukaj 네, 다를 게 없어야합니다. printf '\x01\x02' > f및 으로 시도해보십시오 hd.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

2
bs = 1로 dd보다 훨씬 빠릅니다. 감사합니다! tail은 0이 아닌 1에서 바이트를 계산합니다. 또한 tail은 헤드에 의해 출력이 너무 일찍 닫히면 오류 코드 1과 함께 종료됩니다. "set -e"를 사용할 때이 오류를 무시하십시오.
proski

2

dd 명령은이 모든 작업을 수행 할 수 있습니다. 호출의 일부로 탐색 및 / 또는 건너 뛰기 매개 변수를 확인합니다.


2

더 빠르게

dd bs=<req len> count=1 skip=<req offset> if=input.binary of=output.binary 

2
여기서 문제는 skip단위가 bs.
Arkku 19

그러나 이것은 가장 찬성 된 답변이어야합니다. bs = 1 인 위의 답변은 매우 느립니다. : D
Tchakabam

실행자에 대한 세부 사항이며 위의 것보다 더 좋습니다. 사실 다음 req_offset=$(bc <<< "$offset/$bs")과 같이 다시 계산 해야합니다.
Tchakabam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.