bash script2023. 7. 14. 10:22

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/586095

 

grep 명령은 주로 텍스트 파일에서 문자열을 검색할 때 사용하지만, 바이너리 파일에서 통상 16진수로 표현되는 특정 데이터를 검색하는 것도 가능하다. 물론 hexdump를 이용해서 바이너리 파일을 16진수 텍스트로 변환한 후에 grep 명령을 조합하여 사용해도 되나, grep 명령만으로 더 간편하게 검색할 수 있는 방법이 있다. -P 옵션을 활용해서 Perl 정규표현식(Perl regular expression)을 인자로 사용하면 된다.

 

예를 들어 my_data.bin 파일에서 16진수 0x0800 포함 여부를 확인하는 경우를 생각해 보자. 터미널 창에서 아래와 같이 입력하면 된다.

# my_data.bin 파일에 0x0800 포함 여부 확인
grep -P "\x08\x00" my_data.bin

만약 my_data.bin 파일에 해당 데이터가 있다면 "Binary file my_data.bin matches"라는 메세지가 출력될 것이다. 각 16진수마다 "\x"를 붙여주어야 함에 유의하자. 위의 예시를 보자면 "\x0800"이 아니라 "\x08\x00"이다.

만약 해당 데이터가 몇번 출현했는지 알고 싶다면 -c 옵션을 추가하면 된다.

# my_data.bin 파일에 포함된 0x0800 개수 출력(-c 옵션)
grep -P -c "\x08\x00" my_data.bin

만약 파일 이름만 출력하고 싶다면 -l 옵션을 사용하자. 여러개의 바이너리 파일에 대해 검색을 할 경우에 요긴하다.

# 확장자가 bin인 파일중에 0x0800이 포함된 파일 이름만 출력(-l 옵션)
grep -P -l "\x08\x00" *.bin

 

728x90
Posted by 반달가면