Combinando o comando strings e grep: como limitar os resultados para sequências terminadas com nulo

1

Tenho a sensação de que é strings , o que está frustrando meus esforços aqui. Os arquivos binários que eu quero usar strings infelizmente produzem várias correspondências por arquivo, embora seja uma regra de 100% que exatamente um deles contenha a cadeia com um caractere NUL no final. E esta é a string que eu quero. Também estou trabalhando dessa forma para garantir que os falsos positivos sejam eliminados desde o início.

Infelizmente, parece que strings não pode ser ensinado a preservar os bytes nulos para que eu possa grep para some_expressionstrings .

Linha de amostra: (simplificada)

$ find . -maxdepth 1 -type f -size +1M -print0 | xargs -0 strings -fwn 3 | grep -w 'XYZ'

Se ... | grep -w 'XYZ[^[:print:]]' pudesse ser instruído para manter os caracteres grep , isso permitiria algo como tr no final do canal mais tarde. Mas é claro, NUL é impotente sempre que o comando anterior no pipe já eliminou o '\ 0'.

Eu até pensei em uma maneira (bastante feia) de resolver esse problema colocando %code% 'ing cada caractere' \ 0 'em algo como' \ 177 '(decimal 255) em todo o arquivo que está sendo processado. Mas isso provavelmente renderia muitos falsos positivos.

Alguma solução melhor por aí?

Nota adicional : Embora essa questão cubra apenas o caso mais comum ( %code% ), uma solução ideal seria definida como uma que é adequada para fácil adaptação em outros caracteres não imprimíveis usado para finalização de string também.

    
por syntaxerror 07.02.2016 / 02:15

1 resposta

1

Faça grep fazer o trabalho de strings . Se você tiver o grep do GNU, passe a opção -z para torná-lo ler registros delimitados por nulo em vez de registros delimitados por nova linha. Isso também coincidirá no final do arquivo, mas isso deve estar ok na prática.

find . -maxdepth 1 -type f -size +1M -print0 |
xargs -0 grep -Eoz '[[:print:]]{3,}$'

Se você não tiver utilitários GNU, passe o arquivo através de tr para trocar os bytes nulos por novas linhas. Enquanto você faz isso, crie tr caracteres não imprimíveis.

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
' _ {} +
    
por 08.02.2016 / 01:51