AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 492725
Accepted
Philip Kirkbride
Philip Kirkbride
Asked: 2019-01-06 16:06:53 +0800 CST2019-01-06 16:06:53 +0800 CST 2019-01-06 16:06:53 +0800 CST

Analisar todas as strings de comprimento específico?

  • 772

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?

text-processing files
  • 4 4 respostas
  • 2552 Views

4 respostas

  • Voted
  1. pizdelect
    2019-01-06T17:10:45+08:002019-01-06T17:10:45+08:00

    Se você pretende pesquisar um número de 256 bits em formato hexadecimal (64 caracteres do intervalo 0-9e A-F-- um dos formatos em que uma chave privada bitcoin pode aparecer), isso deve funcionar:

    egrep -aro '\<[A-F0-9]{64}\>' files and dirs ...
    

    Adicione a -iopção ou inclua também o a-fintervalo 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 -Popçã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:

    echo ÁRVÍZtűrő tükörFÚRÓgép |
       LC_CTYPE=en_US.UTF-8 grep -Po '(?<!\p{Lu})\p{Lu}{2,4}(?!\p{Lu})'
    FÚRÓ
    

    Substitua \p{Lu}por \p{Ll}letras minúsculas, \Snã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)

    • 8
  2. Fox
    2019-01-06T16:42:50+08:002019-01-06T16:42:50+08:00

    Se você quiser encontrar todas as palavras de comprimento 64 de /path/to/file, você pode usar

    tr -c '[:alnum:]' '\n' < /path/to/file | grep '^.\{64\}$'
    

    Isso 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.

    • 5
  3. Best Answer
    terdon
    2019-01-06T16:47:50+08:002019-01-06T16:47:50+08:00

    Se você tem GNU grep(padrão no Linux), você pode fazer:

    grep -Po '(^|\s)\S{64}(\s|$)' file
    

    O -Ppermite 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 -omeios "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:

    grep -Po '(^|\s)\K\S{64}(?=\s|$)'
    

    Isso procurará um caractere de espaço em branco ou o início da string (\s|^), depois o descartará \Ke 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.

    • 4
  4. user232326
    2019-01-06T17:50:15+08:002019-01-06T17:50:15+08:00

    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 lampusar ,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.
    • \blimite 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:

     grep -o '\<.\{64\}\>' file
    

    Se você pudesse usar o regex estendido, o \poderia ser reduzido:

     grep -oE '\<.{64}\>' file
    

    Isso seleciona de um "início de palavra" ( \<), 64 ( {64}) caracteres ( .), a um "fim de palavra" ( \>) e imprime apenas as -opartes 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:

     grep -oE '\<[0-9a-fA-F]{64}\>' file
    

    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:

     LC_ALL=C grep -oE '\<[0-9a-fA-F]{64}\>' file
    

    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):

    grep -oP '\b[0-9a-fA-F]{64}\b' file
    

    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" .

    • 2

relate perguntas

  • du/df e ls relatando diferentes usos de disco

  • Reorganize as letras e compare duas palavras

  • Subtraindo a mesma coluna entre duas linhas no awk

  • Embaralhamento de arquivo de várias linhas

  • como posso alterar o caso do caractere (de baixo para cima e vice-versa)? ao mesmo tempo [duplicado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve