Como remover todos os números da saída hexdump?

0

Eu tenho a saída base64 para um arquivo enorme, a saída também é obviamente enorme e em um arquivo próprio, eu queria converter o grande número para base10 , então usei hexdump para obtê-lo em base16 format ... Mas a saída é algo como isto:

0077000 0022 00de 0000 0000 de00 0800 0000 0000
0077010 0008 0473 0c16 221f 0200 0000 0001 0100
0077020 0001 0022 00de 0000 0000 de00 0800 0000
0077030 0000 0008 0473 0c16 221f 0200 0000 0001
0077040 0100 0101 0032 00df 0000 0000 df00 0800
0077050 0000 0000 0008 0473 0c16 221f 0200 0000
0077060 0001 0100 0010 0073 006c 002d 006d 006f
0077070 0064 0065 006d 0000 0000 0000 0000 0000
0077080 0000 0000 0000 0000 0000 0000 0000 0000
*
0077800 0022 00df 0000 0000 df00 0800 0000 0000
0077810 0008 0473 0c16 221f 0200 0000 0001 0100
0077820 0001 0022 00df 0000 0000 df00 0800 0000
0077830 0000 0008 0473 0c16 221f 0200 0000 0001
0077840 0100 0101 0078 d690 0008 0800 90d6 961a
0077850 0006 0600 1a96 0473 0c16 221f 0000 0000
0077860 0001 0100 0056 0073 006c 002d 006d 006f
0077870 0064 0065 006d 002d 0064 0061 0065 006d
0077880 006f 006e 005f 0032 002e 0039 002e 0031
0077890 0031 007e 0032 0030 0031 0031 0030 0033
00778a0 0032 0031 002d 0031 0031 005f 0069 0033
00778b0 0038 0036 002e 0064 0065 0062 0000 0000
00778c0 0000 0000 0000 0000 0000 0000 0000 0000
*

Eu sei como remover todos os espaços e retorna e fazer tudo em uma linha , mas como faço para transformar as estrelas nas linhas removidas que elas representam e remova os primeiros 8 caracteres que não fazem parte do número? Ou talvez haja uma maneira de fazer com que hexdump apenas exiba o número em vez de todas as outras coisas? O arquivo é obviamente muito grande para que eu faça manualmente, então um comando para fazer isso automaticamente seria muito apreciado. Estou executando o Ubuntu GNOME 15.10 com o GNOME 3.18.

    
por muru 11.04.2016 / 19:58

3 respostas

5

Você pode usar xxd para criar dump hexadecimal em estilo simples

$ xxd -p /etc/passwd | head -n 3                                                                                      
726f6f743a783a303a303a726f6f743a2f726f6f743a2f62696e2f626173
680a6461656d6f6e3a783a313a313a6461656d6f6e3a2f7573722f736269
6e3a2f7573722f7362696e2f6e6f6c6f67696e0a62696e3a783a323a323a

E imprimi-lo no arquivo

$ xxd -p /etc/passwd > output.hex

Você pode restaurar dados mais tarde com -r -p options

$ xxd -r -p output.hex  | head -n 3                                                                                   
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

Acople outros métodos:

$ hexdump -ve '1/1 "%.2x"' /etc/passwd
$  od -t x1 /etc/passwd | awk '{$1=""; gsub(/\ /,"");print}'
    
por Sergiy Kolodyazhnyy 11.04.2016 / 20:42
4

Use hexdump especificando um formato de saída personalizado:

hexdump -ve '8/1 "%04x " "\n"'
  • -v : imprime todos os dados (elimina os asteriscos, o que significa a repetição da última linha de saída)
  • -e '8/1 "%04x " "\n"' : imprime 8 vezes um único byte em uma representação heaxadecimal minúscula preenchida com zero (até quatro dígitos) seguida por um espaço e anexa uma nova linha até que não haja mais dados disponíveis.
% </dev/urandom head -c 32 | hexdump -ve '8/1 "%04x " "\n"'
003c 00b0 00bb 00de 003d 0041 0072 00a5
00c2 0078 00b9 009b 00b7 00fc 0076 0030
00b7 005c 00f4 0036 00a0 004e 003b 001b
0028 00cd 006a 0079 0055 0014 000c 007b

Não sei por que você gostaria de fazer isso, mas aparentemente você quer imprimir tudo em uma única linha sem espaços.

Se for esse o caso:

hexdump -ve '/1 "%04x"'
% </dev/urandom head -c 32 | hexdump -ve '/1 "%04x"'
0046007c00b2003300e0009b00eb00d500bf006900570081008e003e005a002f0024001700ab00000084001e00ad00ab003a004800bf0039005c00aa00030072%
% 
    
por kos 11.04.2016 / 20:53
2

Por padrão, hexdump removerá a linha repetida e colocará uma única * no local em que uma ou mais linhas foram removidas. Ao remover a primeira coluna com posições de arquivo, você perderá a única indicação de quantas linhas foram removidas, portanto, não é mais possível reconstruir o arquivo original.

Presumivelmente, você quer um número que represente exclusivamente o arquivo original, então você teria que começar com hexdump -v . Como mostrado em uma resposta anterior, é possível fornecer hexdump outros argumentos para alterar o formato de saída para o formato que você estava solicitando.

No entanto, se por algum motivo você tiver apenas a saída de hexdump -v e não o arquivo original, também será possível remover a primeira coluna e o espaço em branco como este:

cat filename.txt | cut -c9- | tr -dc 0-9a-f

Aqui cut -c9- removerá os 8 caracteres mais à esquerda de cada linha, emitindo apenas o 9º caractere e tudo depois dele. E tr -dc 0-9a-f manterá apenas caracteres no intervalo 0-9 ou a-f, portanto, todos os espaços e novas linhas serão removidos.

    
por kasperd 11.04.2016 / 22:41