Tuesday 9 May 2017

Linux Grep Não Binário Opção



Digamos que eu tenha gerado o seguinte arquivo binário: E dizer, eu quero encontrar os locais de todos os zeros (0x00), usando uma sintaxe grep-like. O melhor que posso fazer até agora é: No entanto, isso implicitamente converte cada byte no arquivo binário original em uma representação ASCII multi-byte, em que grep opera não exatamente o exemplo principal de otimização :) Existe algo como um grep binário para Linux Possivelmente, também, algo que suporta uma expressão regular, como a sintaxe, mas também para caracteres byte - ou seja, eu poderia escrever algo como um (x00) b e corresponder zero ou mais ocorrências de byte 0 entre bytes a (97) E b (98) EDIT: O contexto é que estou trabalhando em um driver, onde eu capturar dados de 8 bits algo vai mal nos dados, que podem ser kilobytes até megabytes, e Id gostaria de verificar assinaturas particulares e onde eles ocorrer. (Até agora, estou trabalhando com trechos de kilobyte, por isso otimização não é tão importante - mas se eu começar a receber alguns erros em megabytes capturas longas, e eu preciso analisá-los, acho que eu gostaria de algo mais otimizado :). E, especialmente, Id como algo onde eu possa grep para um byte como um personagem - hexdump me obriga a procurar seqüências de caracteres por byte) EDIT3: Graças à resposta por tchrist, aqui é também um exemplo com grepping e correspondência e exibindo resultados (embora Não exatamente a mesma questão como OP): Para ter os dados correspondentes ser agrupados como um byte (dois caracteres hexadecimais) cada, então H2 H2 H2. Precisa ser especificado para quantos bytes existem na string correspondente como minha correspondência. 000xCC000. Cobre 17 bytes, eu posso escrever H2x17 em Perl. Cada um destes H2 irá retornar uma variável separada (como em uma lista), então join também precisa ser usado para adicionar espaços entre eles - eventualmente: Bem. Na verdade Perl é muito bom binário grepping facilidade, devo admitir :) Enquanto um aprende a sintaxe corretamente :) perguntou 14 novembro 10 at 22:31 Como um se aplicam isto a arbitrária seqüências binárias Eu tentei o seu perl - ln0777e 39print pos () Enquanto 47illegal47g39 47usr47bin47awk abordagem para encontrar o conteúdo perdido em um arquivo de dispositivo de disco bruto, mas perl barfed em mim com quotOut de memoryquot partway through. Ndash fuzzyTew Dec 9 16 at 14:12 Uma maneira de resolver seu problema imediato usando apenas grep é criar um arquivo contendo um único byte nulo. Depois disso, grep - abo - f nullbytefile targetfile produzirá o seguinte resultado. Isso é, naturalmente, cada byte deslocamento conforme solicitado por-b seguido por um byte nulo como solicitado por - o Id ser o primeiro a defender perl, mas neste caso não há necessidade de trazer o family. grep estendido - Unix, Linux Command Recurse em diretórios skip arquivo correspondência PATTERN. Suprimir mensagens de erro sobre arquivos inexistentes ou ilegíveis. Nota de portabilidade: ao contrário do GNU grep. O grep tradicional não estava em conformidade com o POSIX.2, porque o grep tradicional não possuía uma opção - q e sua opção - s se comportava como a opção GNU grep rsquos - q. Os scripts de shell destinados a serem portáveis ​​ao grep tradicional devem evitar ambos - q e - s e devem redirecionar a saída para devnull em vez disso. Trate o arquivo (s) como binário. Por padrão, em MS-DOS e MS-Windows, grep adivinha o tipo de arquivo olhando o conteúdo do primeiro 32 KB ler do arquivo. Se grep decidir que o arquivo é um arquivo de texto, ele tira os caracteres CR do conteúdo do arquivo original (para fazer expressões regulares com e trabalhar corretamente). Especificar - U substitui essa adivinhação, fazendo com que todos os arquivos sejam lidos e passados ​​ao mecanismo de correspondência verbatim se o arquivo for um arquivo de texto com pares CRLF no final de cada linha, isso fará com que algumas expressões regulares falhem. Esta opção não tem efeito em plataformas que não MS-DOS e MS-Windows. Denunciar offsets de bytes de estilo Unix. Essa opção faz com que o grep relate bytes de deslocamento como se o arquivo fosse um arquivo de texto estilo Unix, isto é, com caracteres CR removidos. Isso produzirá resultados idênticos ao grep em execução em uma máquina Unix. Esta opção não tem efeito a menos que a opção - b também é usada, não tem efeito em plataformas diferentes do MS-DOS e do MS-Windows. Imprime o número da versão de grep para o erro padrão. Esse número de versão deve ser incluído em todos os relatórios de bugs (veja abaixo). Inverter o sentido de correspondência, para selecionar linhas não correspondentes. Selecione apenas as linhas que contenham correspondências que formam palavras inteiras. O teste é que a substring correspondente deve estar no início da linha, ou precedida por um caractere constituinte não-palavra. Da mesma forma, ele deve ser no final da linha ou seguido por um carácter constitutivo não-palavra. Os caracteres constituintes da palavra são letras, dígitos e sublinhado. Selecione apenas os jogos que correspondem exatamente à linha inteira. Sinônimo obsoleto para - i. Emite um byte zero (o caractere ASCII NUL) em vez do caractere que normalmente segue um nome de arquivo. Por exemplo, grep - lZ emite um byte zero após cada nome de arquivo em vez da nova linha usual. Esta opção torna a saída inequívoca, mesmo na presença de nomes de arquivo que contêm caracteres incomuns como novas linhas. Esta opção pode ser usada com comandos como find - print0. Perl -0. Sort - z. E xargs -0 para processar nomes de arquivos arbitrários, mesmo aqueles que contêm caracteres de nova linha. Para Pesquisar a string dada em um único arquivo test. sh chat test. sh binbash fun () echo Este é um teste. Terminar o script do shell com a mensagem de sucesso exit 1 do arquivo acima grep exit: grep exit demofile Para verificar a string dada em vários arquivos: neste caso test. sh e test1.sh chat test. sh binbash fun () echo Este é um teste. Terminar o nosso shell script com mensagem de sucesso exit 1 cat test1.sh binbash fun () echo Este é um test1. Terminar nosso script shell com mensagem de sucesso exit 0 grep exit em ambos os arquivos test. sh e test1.sh: test1.sh: exit 0 test. sh: exit 1 Para pesquisa case-sensitive usando grep - i, adicionado EXIT no test1.sh cat Test1.sh binbash fun () echo Este é um test1. Terminar o nosso shell script com mensagem de sucesso, EXIT com 0 saída 0 grep saída test1.sh test1.sh: saída 0 grep - i teste de saída test1.sh: Terminar o nosso shell script com mensagem de sucesso, EXIT com 0 test1.sh: exit 0 Duas linhas com a opção - i, caso contrário. Se você souber a extensão ou padrão do arquivo que você gostaria, outro método é usar --include option: Você também pode mencionar arquivos a excluir com --exclude. Se você freqüentemente pesquisar através de código, Ag (The Silver Searcher) é uma alternativa muito mais rápida para grep, isso é personalizado para pesquisar código. Por exemplo, seu recursivo por padrão e ignora automaticamente arquivos e diretórios listados em. gitignore. Então você não tem que continuar passando as mesmas opções de exclusão complicadas para grep ou encontrar. Resposta Eu acho que deve ser um. No final, não um ndash Raphael Jun 21 12 às 22:59 Funciona muito bem com o grep que vem com o Cygwin do amplificador Linux, mas não com o que vem com o AIX. Ndash Retido Jan 31 13 em 20:08 Deve ser --includequot. txtquot ndash Krzysztof Wolny 18 de dezembro às 13:28 KrzysztofWolny: em vez de funciona muito bem no Ubuntu. PS: that39s deveria ser um espaço backticked, mas o analisador de markdown de SO falhou. Ndash Dan Dascalescu Feb 19 14 at 9:08 Em - exec opção - símbolo é uma referência para o nome do arquivo que atualmente encontrado pela ferramenta find (que é fazer algo com o nome do arquivo que encontramos), também opção - exec deve ser encerrado com o símbolo (Para marcar o fim dos comandos exec), mas porque tudo isso está sendo executado em um shell, esse símbolo deve ser escapado. E, finalmente, a opção print permite localizar a ferramenta para imprimir nomes de arquivos encontrados na tela. Ndash rook Apr 27 16 at 9:47 ag é a minha maneira favorita de fazer isso agora githubggreerthesilversearcher. É basicamente a mesma coisa que ack, mas com algumas mais otimizações. Respondeu May 21 14 at 23:37 apenas os arquivos podem ser úteis também respondido Dec 3 12 at 17:48 Isso deve funcionar: respondeu 19 dezembro às 7:20 Para localizar o nome dos arquivos com o caminho recursivamente contendo o uso de string específico abaixo comando Para UNIX: encontrar um arquivo no servidor UNIX encontrar um arquivo no servidor LINUX respondeu Se você só quer seguir diretórios reais, e não links simbólicos, Se você quiser seguir links simbólicos, bem como diretórios reais ( Tenha cuidado com recursão infinita), Uma vez que você está tentando grep recursivamente, as seguintes opções também podem ser úteis para você: Então, se você quiser encontrar todos os arquivos que contêm Darth Vader no diretório atual ou qualquer subdiretórios e capturar o nome do arquivo e número de linha, Mas não quer que a recursão siga links simbólicos, o comando seria Se você quiser encontrar todas as menções da palavra gato no diretório e você está atualmente no diretório e você deseja capturar o nome do arquivo, mas não o número da linha de qualquer instância Da corda Gatos, e você quer que a recursão para seguir links simbólicos, se ele encontra-los, você poderia executar qualquer um dos seguintes grep --help Uma breve introdução aos links simbólicos, para qualquer pessoa ler esta resposta e confuso por minha referência a eles: nixtutorfreebsdunderstanding - Links simbólicos Se você estiver procurando por um conteúdo específico em todos os arquivos de uma estrutura de diretório, use find porque é mais claro o que você está fazendo: Note que - l (downcase de L) mostra o nome do arquivo que contém o texto. Remova-o se você quiser imprimir o próprio jogo. Ou use - H para obter o arquivo em conjunto com a correspondência. Em conjunto, outras alternativas são: Onde - n imprime o número da linha. Respondeu Nov 30 15 at 16:19 Up-votado por ser a única solução encontrar tanto para evitar o uso desnecessário de xargs e usar em vez de com - exec. Evitando assim toneladas de processos desnecessários. No meu servidor IBM AIX (versão do sistema operacional: AIX 5.2), use: isso irá imprimir o nome do arquivo de caminho eo número da linha relativa no arquivo como: 2865: Descrição. StringYouWannaFind de qualquer maneira, ele funciona para mim. ) Bem, não - xargs é especificamente para converter um pipe de argumentos para um arglist, mas sim, é verdade que xargs moderno quando usado com - s or ou - L pode lidar com muito arglists por quebrar em invocações comando múltiplo, mas ele Não foi configurado dessa forma por padrão (e wasn39t em qualquer uma das respostas acima). Como exemplo: find. - type f xargs - L 100 grep qualquer ndash m. thome Apr 23 15 at 13:56 Que plataforma que seria no POSIX xargs é padronizado para ter esse comportamento fora da caixa. Quot O utilitário xargs limitará o comprimento da linha de comando de modo que, quando a linha de comando for chamada, as listas combinadas de argumento e ambiente. Não deve exceder -2048 bytes. quot ndash tripleee Apr 23 15 em 15:42 grep recursivo

No comments:

Post a Comment