grep retorna
Arquivo binário test.log corresponde
Por exemplo
echo "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log # in zsh
echo -e "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log # in bash
grep re test.log
Desejo que o resultado mostre a linha 1 e a linha 3 (total de duas linhas).
É possível tr
converter os dados não imprimíveis em dados legíveis, para deixar o grep funcionar novamente?
-e
noecho
comando?Respostas:
Você pode executar o arquivo de dados
cat -v
, por exemploque poderia ser posteriormente pós-processado para remover o lixo; isso é mais análogo à sua consulta sobre o uso
tr
para a tarefa.fonte
man cat
diz sobre-v
:-v, --show-nonprinting
use ^ and M- notation, except for LFD and TAB
set | cat -v | grep variable
grep --text
nem sempre funciona; ele respeita CTRL + D como um terminador de arquivo. Portanto, se você tiver isso em seu arquivo binário, o grep sairá mais cedo.Não pode ser mais simples do que isso.
fonte
grep --text
que o paxdiablo mencionou 2 anos antesLC_ALL="C" grep -a
Uma maneira é simplesmente tratar os arquivos binários como texto de qualquer maneira, com
grep --text
mas isso pode muito bem resultar no envio de informações binárias ao seu terminal. Isso não é realmente uma boa ideia se você estiver executando um terminal que interpreta o fluxo de saída (como VT / DEC ou muitos outros).Como alternativa, você pode enviar seu arquivo
tr
com o seguinte comando:Isso mudará qualquer coisa menor que um caractere de espaço (exceto nova linha) e qualquer coisa maior que 126 em um
.
caractere, deixando apenas os imprimíveis.Se quiser que cada caractere "ilegal" seja substituído por um diferente, você pode usar algo como o seguinte programa C, um filtro de entrada padrão clássico:
Isso lhe dará
{{NN}}
, ondeNN
está o código hexadecimal para o personagem. Você pode simplesmente ajustar oprintf
para qualquer estilo de saída que desejar.Você pode ver esse programa em ação aqui, onde:
fonte
tr '[:cntrl:] '.'
melhor E deve estar\000-\010\013\014\016-\037\177-\377'
em sua sintaxe tr.tr '[\000-\010\013\014\016-\037\177-\377]' '_'
viável, o cntrl não é adequado para o meu caso.cat
etapa canalizandogrep --text
emtr
vez de vice-versa. Isso também permite que você execute grep em vários arquivos e mantenha a referência do nome do arquivo na saída.Você pode usar "strings" para extrair strings de um arquivo binário, por exemplo
fonte
Você pode forçar o grep a olhar os arquivos binários com:
Você também pode querer adicionar
-o
(--only-matching
) para não obter toneladas de jargões binários que irão danificar seu terminal.fonte
--only-matching
e sua regex não corresponder a dados binários arbitrários, não terá problemas.A partir do Grep 2.21, os arquivos binários são tratados de forma diferente :
Então, o que acontece agora é que, com dados binários, todos os bytes não textuais (incluindo novas linhas) são tratados como terminadores de linha. Se quiser mudar esse comportamento, você pode:
usar
--text
. Isso irá garantir que apenas novas linhas sejam terminadores de linhausar
--null-data
. Isso irá garantir que apenas bytes nulos sejam terminadores de linhafonte
grep -a forçará o grep a pesquisar e gerar a saída de um arquivo que o grep pensa ser binário. grep -a re test.log
fonte
Como James Selvakumar já disse,
grep -a
faz o truque. -a ou --text força Grep a tratar o fluxo de entrada como texto. Consulte a página de manual http://unixhelp.ed.ac.uk/CGI/man-cgi?grepexperimentar
fonte
você pode fazer
isso converterá a saída em uma string legível para grep.
fonte
Você também pode experimentar a ferramenta Word Extractor . O Word Extractor pode ser usado com qualquer arquivo em seu computador para separar as strings que contêm texto / palavras humanas do código binário (aplicativos exe, DLLs).
fonte
Aqui está o que usei em um sistema que não tinha o comando "strings" instalado
Isso imprime o texto e remove caracteres não imprimíveis de uma só vez, ao contrário de "cat -v filename" que requer algum pós-processamento para remover coisas indesejadas. Observe que alguns dos dados binários podem ser impressos, portanto, você ainda obterá alguma confusão entre as coisas boas. Eu acho que strings remove esse jargão também se você pode usar isso.
fonte