
(Windows) 실행 파일에서 특정 문자열을 찾고 있습니다.
처음에는
grep -a string file
이는 바이너리 파일을 텍스트 파일처럼 취급하기 때문입니다. 문제는 깔끔한 출력이 없고, 우연히(올바른 바이트가 순서대로 올 때) 줄 바꿈이 발생한다는 것입니다.
그래서 나는 문자열을 사용할 것이라고 생각했습니다.
strings file | grep -i string
놀랍게도 'strings'는 'grep -a'를 사용하여 찾을 수 있었던 문자열을 찾지 못합니다. 그러나 '문자열'은 찾은 항목의 각 항목을 새 줄에 출력한다는 점에서 좋습니다.
두 세계의 장점을 모두 얻으려면 어떻게 해야 합니까? 즉, 실제로 모든 것을 찾고, 발견된 내용에 대한 합리적인 결과도 얻고 싶습니다.
답변1
strings
문자열과 동일한 패턴을 찾지 못합니다. 최소 4자 길이의 패턴을 찾는 경우 발생할 가능성이 높습니다 strings
.그리고그 뒤에는 인쇄할 수 없는 문자가 옵니다. man strings
GNU의 경우 strings
:
For each file given, GNU strings prints the printable character
sequences that are at least 4 characters long (or the number given
with the options below) and are followed by an unprintable character.
게다가 strings
기본적으로 개체 파일의 초기화되고 로드된 섹션만 검사하므로 출력 줄 수가 더욱 줄어들 수 있습니다.
해당 동작을 변경하려면 -a
및 옵션을 시도해 볼 수 있습니다 .-n
strings -n 1 -a file | grep -i string
그러면 더 많은 문자열이 제공될 것이며 아마도 여러분이 기대하는 모든 문자열이 제공될 것입니다.
내 실행 파일의 출력 차이 python
:
$ strings $(which python) | wc
31923 68075 474068
$ strings -n 1 $(which python) | wc
501231 531837 1541204
$ strings -n 1 -a $(which python) | wc
501398 531995 1541762
답변2
왜 안 돼:
grep -a string file | strings
strings
최소 4자 길이의 인쇄 가능한 문자 시퀀스를 인쇄합니다. 따라서 grep
4자보다 짧은 항목의 경우 strings
먼저 처리하면 누락될 수 있습니다. strings -n 1
최소 길이를 1로 설정하는 데 사용됩니다 .