今天工作的时候遇到一个命令:xxd
,说来惭愧,虽然曾在Linux系统下工作了好多年,但是这个命令我却真的是第一次看到。为了搞明白这个命令,我对着man手册做了一些测试,我将学到的东西记录到这里,一则方便自己以后查找,二则希望给和我一样第一次遇到这个命令一头雾水的朋友一些参考。
(图源 :pixabay)
xxd的使用
对于给定的文件或者标准输入,以十六进制显示其内容,或者反过来转换
为了演示xxd的使用,我创建了一个简单的文本文件hello.txt
:
Hello World, I am oflyhigh!
xxd - make a hexdump or do the reverse.
不带参数的xxd命令
xxd hello.txt
通过对比输出内容,我们的出结论:
不带参数的xxd命令,以16进制形式输出文件内容,前边是地址,数据2个字节一组,每行显示8组,后边显示对应的文本内容。
-g
分组参数
通过分组参数,我们可以指定多少个字节为一组,默认为2。
xxd -g 1 hello.txt
-c
列参数
通过 -c
参数,我们可以指定每列显示几个字节
xxd -g 1 -c 8 hello.txt
-b
二进制形式显示
通过 -b
参数,我们可以指定以二进制形式显示内容
xxd -b -g 1 -c 6 hello.txt
-i
参数,生成C语言格式的数组
通过-i
参数,我们生成C语言格式的数组,同时可以通过-c
参数控制格式
xxd -i -c 10 hello.txt
-l
参数,指定长度
通过-l
参数,我们指定要处理的内容长度(字节数)
xxd -l 24 -g 1 -c 12 hello.txt
-p
参数,纯HEX转储
通过-p
参数,我们输出内容的纯HEX显示
xxd -p -l 24 -c 12 hello.txt
-s [+][-]seek
搜索功能
我们通过-s [+][-]seek
来实现从文件首尾指定开始长度的功能
xxd -g 1 hello.txt
xxd -s 0x10 -g 1 hello.txt
-r
参数
通过 -r
参数,可以将类似这样输出,转出成普通文件
比如我们将上述例子中的输出存储到文件
xxd -s 0x10 -g 1 hello.txt > example.txt
打开这个文件,可以发现文件中包含如下文本:
0000010: 6d 20 6f 66 6c 79 68 69 67 68 21 0a 78 78 64 20 m oflyhigh!.xxd
0000020: 2d 20 6d 61 6b 65 20 61 20 68 65 78 64 75 6d 70 - make a hexdump
0000030: 20 6f 72 20 64 6f 20 74 68 65 20 72 65 76 65 72 or do the rever
0000040: 73 65 2e 0a se..
xxd -r example.txt
是不是非常神奇?
用途
通过上述介绍,我们应该想到xxd有很多用途啦。
不过一个重要的用途就是十六进制编辑,比如上述介绍的最后一条,我们可以编辑生成的十六进制的文本文件,再通过xxd -r
保存成文件,这样就达到了十六进制编辑的目的。
地址编辑,我们还可以通过编辑上述文件中的地址,达到在指定地址写入指定内容的目的。
文件截取,在学习-r
参数时,我组合出下列一条指令,猜猜它干什么用的?
xxd -s 0x10 -g 1 hello.txt | xxd -r -seek -0x10 >1.txt
更多内容
想了解关于xxd的更多内容,请输入man xxd