strings
이것이 나의 노력을 방해하고 있다는 느낌이 듭니다 . 안타깝게도 제가 사용하려는 바이너리는 strings
파일당 여러 개의 일치 항목을 생성합니다. 하지만 100% 규칙은 파일 중 하나에 NUL
끝에 문자가 있는 문자열이 정확히 포함되어 있다는 것입니다. 제가 원하는 문자열입니다. 나 역시 이런 식으로 노력하고 있다.거짓 긍정 제거처음부터.
불행 strings
하게도 널 바이트를 보존하는 방법을 가르칠 수 있는 방법이 없는 것 같아서 .grep
some_expression\0
예시 라인: (간체)
$ find . -maxdepth 1 -type f -size +1M -print0 | xargs -0 strings -fwn 3 | grep -w 'XYZ'
strings
당신이 말할 수 있다면유지하다문자를 사용하면 파이프 끝과 같은 것이 나중에 나타날 \0
수도 있습니다 . ... | grep -w 'XYZ[^[:print:]]'
그러나 물론 grep
파이프라인의 이전 명령이 완료되는 한 수행할 수 있는 작업은 없습니다.제거됨'\0'.
나는 심지어 이 문제를 해결하기 위한 (다소 추악한) 방법을 생각했습니다. 그것은 tr
처리 중인 전체 파일에서 모든 "\0" 문자를 "\177"(십진수 255)로 변환하는 것입니다. 그러나 이는 너무 많은 오탐지를 생성할 수 있습니다.
더 나은 해결책이 있습니까?
추가 정보: 이 질문은 가장 일반적인 경우( NUL
)에만 적용되지만 최적의 솔루션은 문자열 종료에 사용되는 인쇄할 수 없는 다른 문자에도 쉽게 적용하는 데 적합한 솔루션으로 정의됩니다.
답변1
잘 grep
했어요 strings
. GNU grep이 있는 경우 -z
줄 바꿈으로 구분된 레코드 대신 null로 구분된 레코드를 읽도록 옵션을 전달하세요. 이는 파일 끝에서도 일치하지만 실제로는 문제가 없습니다.
find . -maxdepth 1 -type f -size +1M -print0 |
xargs -0 grep -Eoz '[[:print:]]{3,}$'
GNU 유틸리티가 없으면 파일을 전달하여 tr
널 바이트를 개행 문자로 바꾸십시오. 이렇게 하면 tr
가비지 문자를 인쇄할 수 없는 문자로 설정하십시오.
find . -type d -prune -o -type f -size +1024k -exec sh -c '
for x; do
<"$x" tr \\0\\n \\n\\0 | tr -dsC "[:print:]" \\n |
grep ...
done
' _ {} +