Eu exportei meu arquivo de e-mail de 10 anos, que é muito grande.
Eu quero analisar todo o texto para qualquer string com 64 caracteres em busca de uma chave privada bitcoin.
Como posso analisar strings de um determinado comprimento em caracteres?
Eu exportei meu arquivo de e-mail de 10 anos, que é muito grande.
Eu quero analisar todo o texto para qualquer string com 64 caracteres em busca de uma chave privada bitcoin.
Como posso analisar strings de um determinado comprimento em caracteres?
Se você pretende pesquisar um número de 256 bits em formato hexadecimal (64 caracteres do intervalo
0-9
eA-F
-- um dos formatos em que uma chave privada bitcoin pode aparecer), isso deve funcionar:Adicione a
-i
opção ou inclua também oa-f
intervalo se algumas das chaves estiverem em minúsculas.Para o problema geral de encontrar execuções de caracteres da mesma classe com um comprimento especificado, é melhor usar pcre regexps, que pode ser usado com GNU grep com a
-P
opção . Por exemplo, para encontrar execuções de letras maiúsculas de qualquer conjunto de caracteres, de comprimento mínimo de 2 e comprimento máximo de 4, e que são delimitados por caracteres que não são letras maiúsculas:Substitua
\p{Lu}
por\p{Ll}
letras minúsculas,\S
não espaços, etc. Veja aqui e aqui a lista completa.(?<!...)
e(?!...)
são asserções de largura zero lookbehind e lookahead negativos ; por exemplo , corresponderá a um caractere "palavra" quando não estiver entre colchetes e . A asserção de largura zero de poderia ser implementada por .(?<!<)\w(?!>)
<
>
\<
vi
(?<!\w)(?=\w)
Se você quiser encontrar todas as palavras de comprimento 64 de
/path/to/file
, você pode usarIsso substitui todos os caracteres não alfanuméricos por novas linhas, de modo que cada palavra fica em sua própria linha. Em seguida, ele filtra esse resultado para incluir apenas as palavras de comprimento 64.
Se você tem GNU
grep
(padrão no Linux), você pode fazer:O
-P
permite Expressões Regulares Compatíveis com Perl, que nos fornecem\b
(limites de palavras)\S
(não espaços em branco) e{N}
(encontram exatamente N caracteres), e os-o
meios "imprimem apenas a parte correspondente da linha. espaços em branco com exatamente 64 caracteres que estão no início da linha (^
) ou após o espaço em branco ('s
) e que terminam no final da linha ($
) ou com outro caractere de espaço em branco.Observe que o resultado incluirá quaisquer caracteres de espaço em branco no início e no final da string, portanto, se você quiser analisar mais adiante, poderá usar isso:
Isso procurará um caractere de espaço em branco ou o início da string
(\s|^)
, depois o descartará\K
e procurará 64 caracteres que não sejam de espaço em branco seguidos por ((?=foo)
é chamado de " lookahead " e não será incluído na correspondência) um caractere de espaço em branco, ou o fim da linha.Parece que o grep é a ferramenta correta para "procurar" uma string. O que resta a fazer é definir tal string com um regex. A primeira questão é definir os limites de uma palavra. Não é tão simples como "um espaço", como
a book, a lamp
usar,
como delimitador de palavras, no mesmo conceito, muitos outros caracteres, ou mesmo o início ou o fim de uma linha poderia atuar como delimitador de palavras. Existem alguns delimitadores de palavras no GNU grep:\<
palavra iniciar.\>
palavra final.\b
limite da palavra.Todos eles assumem que uma palavra é uma sequência de
[a-zA-Z0-9_]
caracteres. Se estiver tudo bem para você, este regex pode funcionar:Se você pudesse usar o regex estendido, o
\
poderia ser reduzido:Isso seleciona de um "início de palavra" (
\<
), 64 ({64}
) caracteres (.
), a um "fim de palavra" (\>
) e imprime apenas as-o
partes correspondentes ( ).No entanto, o ponto (
.
) corresponderá a qualquer caractere, o que pode ser demais.Se você quiser ser mais rigoroso na seleção (dígitos hexadecimais), use:
O que permitirá dígitos hexadecimais em letras minúsculas ou maiúsculas. Mas se você realmente quiser ser rigoroso, pois alguns caracteres não ASCII podem ser incluídos, use:
Algumas implementações de grep (como grep -P) não têm um "início de palavra" ou "fim de palavra" (como
\<
e\>
), mas têm "limite de palavra" (como\b
):Existem algumas linguagens que aceitam os limites de palavras POSIX
[[:<:]]
e[[:>:]]
, mas não perl, e somente a partir do PCRE 8.34 .E há muito mais sabores de "limites de palavras" .