hexdump
상황은 다음과 같습니다. 출력에서 문자열 A와 문자열 B 사이의 바이트를 찾아야 합니다 . 16진수 덤프는 다음과 같이 구성됩니다.
-random bytes
-A + useful bytes + B
-random bytes
-A + useful bytes + B
-random bytes
이제 질문은: - "A에서 B로" grep이 가능합니까? 매뉴얼 페이지나 인터넷에서는 이와 같은 내용을 볼 수 없습니다. 수동으로 할 수 있다는 것을 알고 있지만 스크립트를 작성해야 합니다. - 라인 번호 없이 16진수 덤프 출력을 표시할 수 있습니까? 합리적인 것 같지만 아직 방법을 찾지 못했습니다.
감사해요!
편집: 루프백 장치에서 삭제된 JPEG 이미지 2개를 복구하려고 하므로 모든 출력을 표시할 수는 없지만(매우 깁니다) 여기에 그 일부가 있습니다.
0010400 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 01
0010410 00 01 00 00 ff fe 00 3c 43 52 45 41 54 4f 52 3a
[...]
0030f50 3e e9 fb a4 54 37 70 7f cb 55 03 fd af f1 a2 32
0030f60 e8 26 8f ff d9 00 00 00 00 00 00 00 00 00 00 00
표준에 따르면 JPEG 파일은 0xff 0xd8로 시작하고 0xff 0xd9로 끝나므로 이 두 문자열 사이의 모든 정보를 얻고 싶습니다. (이 방법이 작동해야 한다고 생각하지만 아직 테스트하지는 않았습니다.)
답변1
언급했듯이 엄격하게 바이너리로 유지하는 것이 더 나은 생각일 것입니다.여기 bbe
작업을 위한 도구인 것 같습니다. 다음 명령은 제로 패딩된 디지털 파일에 JPEG를 씁니다.
bbe -s -b '/\xff\xd8/:/\xff\xd9/' -e 'w %05B.jpg' > /dev/null
답변2
테스트되지 않은
awk '
/ff d8/ || ($2 == "d8" && ff_prevline) {p = 1}
p {print}
/ff d9/ || ($2 == "d9" && ff_prevline) {p = 0}
{ff_prevline = ($NF == "ff")}
'
답변3
한 가지 방법은 을 사용하는 것입니다 . 줄 번호 사이 와 줄 번호 없이 바이트 범위 perl
만 출력합니다 .ff 8d
ff 9d
다음 데이터는 다음과 같다고 가정합니다 infile
.
0010400 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 01
0010410 00 01 00 00 ff fe 00 3c 43 52 45 41 54 4f 52 3a
0030f50 3e e9 fb a4 54 37 70 7f cb 55 03 fd af f1 a2 32
0030f60 e8 26 8f ff d9 00 00 00 00 00 00 00 00 00 00 00
다음 perl
줄을 실행하세요:
perl -ne '
if ( (my $start = m/ff\sd8/) .. (my $end = m/ff\sd9/) ) {
s/\S*\s//;
s/\A.*(?=ff\sd8)// if $start;
s/(?<=ff\sd9).*\Z// if $end;
print
}
' infile
그러면 다음과 같은 출력이 제공됩니다.
ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 01
00 01 00 00 ff fe 00 3c 43 52 45 41 54 4f 52 3a
3e e9 fb a4 54 37 70 7f cb 55 03 fd af f1 a2 32
e8 26 8f ff d9