如何从十六进制转储输出中删除除数字之外的所有内容?

如何从十六进制转储输出中删除除数字之外的所有内容?

我得到了base64一个大文件的输出,这个输出显然也很大,并且在它自己的文件中,我想将其中的大数字转换为,base10所以我现在已经习惯hexdump将其转换为base16格式...但输出看起来像这样:

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
*

我知道如何删除所有空格和回车符并使其全部位于一行,但我如何将星号变成它们所代表的已删除的行并删除不属于数字的前 8 个字符?或者有没有办法hexdump只输出数字而不是所有其他内容?该文件显然太大了,我无法手动执行此操作,因此非常希望有一个自动执行此操作的命令。我正在运行带有 GNOME 3.18 的 Ubuntu GNOME 15.10。

答案1

您可以使用xxd创建纯样式十六进制转储

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

并输出到文件

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

您可以稍后使用-r -p选项恢复数据

$ 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

结合其他方法:

$ hexdump -ve '1/1 "%.2x"' /etc/passwd
$  od -t x1 /etc/passwd | awk '{$1=""; gsub(/\ /,"");print}'

答案2

使用hexdump指定自定义输出格式:

hexdump -ve '8/1 "%04x " "\n"'
  • -v:打印所有数据(去掉星号,表示重复最后一行输出)
  • -e '8/1 "%04x " "\n"':以零填充(最多四位数字)的小写十六进制表示形式打印 8 次单个字节,后跟一个空格并附加一个换行符,直到没有更多可用数据。
% </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

我不确定你为什么要这样做,但显然你想将所有内容打印在一行上而没有空格。

如果是这样的话:

hexdump -ve '/1 "%04x"'
% </dev/urandom head -c 32 | hexdump -ve '/1 "%04x"'
0046007c00b2003300e0009b00eb00d500bf006900570081008e003e005a002f0024001700ab00000084001e00ad00ab003a004800bf0039005c00aa00030072%
% 

答案3

默认情况下,hexdump将删除重复的行,并在删除一行或多行的位置添加一行*。通过删除包含文件位置的第一列,您将失去删除了多少行的唯一指示,因此无法再重建原始文件。

假设您想要一个唯一代表原始文件的数字,因此您必须从 开始hexdump -v。如上一个答案所示,可以提供hexdump其他参数来将输出格式更改为您要求的格式。

但是如果由于某种原因您只有输出hexdump -v而没有原始文件,那么也可以像这样删除第一列和空格:

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

这里cut -c9-将删除每行最左边的 8 个字符,仅输出第 9 个字符及其后的所有内容。并且tr -dc 0-9a-f将仅保留 0-9 或 af 范围内的字符,因此所有空格和换行符都将被删除。

相关内容