![grep을 사용하여 찾은 문자열이 텍스트를 출력하지 않습니다.](https://linux55.com/image/57089/grep%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%B0%BE%EC%9D%80%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%B4%20%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%B6%9C%EB%A0%A5%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
(Windows) 실행 파일에서 특정 문자열을 찾고 있습니다.
처음에는
grep -a string file
바이너리 파일을 텍스트 파일로 취급하기 때문입니다. 문제는 깔끔한 출력이 없고, 개행 문자가 우연히(올바른 바이트가 순서대로 올 때) 발생한다는 것입니다.
그래서 문자열을 사용해야 한다고 생각했습니다.
strings file | grep -i string
놀랍게도 "strings"는 "grep -a"를 사용하여 찾은 문자열을 찾을 수 없습니다. 그러나 "문자열"의 장점은 새 줄에서 발견된 모든 항목을 출력할 수 있다는 것입니다.
어떻게 하면 두 세계의 장점을 모두 얻을 수 있나요? 이는 실제로 모든 것을 찾고 내가 찾은 것의 합리적인 결과를 얻고 싶다는 것을 의미합니다.
답변1
strings
문자열과 동일한 패턴을 찾지 못하는 경우는 strings
4자 이상의 패턴을 찾는 경우에 발생할 가능성이 높습니다.그리고인쇄할 수 없는 문자가 뒤에 옵니다. 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
via를 먼저 통해 처리하면 콘텐츠가 손실됩니다. strings -n 1
최소 길이를 1로 설정하는 데 사용됩니다 .