문자열 명령과 grep 결합: 결과를 null로 끝나는 문자열로 제한하는 방법

문자열 명령과 grep 결합: 결과를 null로 끝나는 문자열로 제한하는 방법

strings이것이 나의 노력을 방해하고 있다는 느낌이 듭니다 . 안타깝게도 제가 사용하려는 바이너리는 strings파일당 여러 개의 일치 항목을 생성합니다. 하지만 100% 규칙은 파일 중 하나에 NUL끝에 문자가 있는 문자열이 정확히 포함되어 있다는 것입니다. 제가 원하는 문자열입니다. 나 역시 이런 식으로 노력하고 있다.거짓 긍정 제거처음부터.

불행 strings하게도 널 바이트를 보존하는 방법을 가르칠 수 있는 방법이 없는 것 같아서 .grepsome_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
' _ {} +

관련 정보