grep을 사용하여 찾은 문자열이 텍스트를 출력하지 않습니다.

grep을 사용하여 찾은 문자열이 텍스트를 출력하지 않습니다.

(Windows) 실행 파일에서 특정 문자열을 찾고 있습니다.

처음에는

grep -a string file

바이너리 파일을 텍스트 파일로 취급하기 때문입니다. 문제는 깔끔한 출력이 없고, 개행 문자가 우연히(올바른 바이트가 순서대로 올 때) 발생한다는 것입니다.

그래서 문자열을 사용해야 한다고 생각했습니다.

strings file | grep -i string

놀랍게도 "strings"는 "grep -a"를 사용하여 찾은 문자열을 찾을 수 없습니다. 그러나 "문자열"의 장점은 새 줄에서 발견된 모든 항목을 출력할 수 있다는 것입니다.

어떻게 하면 두 세계의 장점을 모두 얻을 수 있나요? 이는 실제로 모든 것을 찾고 내가 찾은 것의 합리적인 결과를 얻고 싶다는 것을 의미합니다.

답변1

strings문자열과 동일한 패턴을 찾지 못하는 경우는 strings4자 이상의 패턴을 찾는 경우에 발생할 가능성이 높습니다.그리고인쇄할 수 없는 문자가 뒤에 옵니다. man stringsGNU 에서 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자 미만인 경우 stringsvia를 먼저 통해 처리하면 콘텐츠가 손실됩니다. strings -n 1최소 길이를 1로 설정하는 데 사용됩니다 .

관련 정보