侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux下od命令用法详解:如何查看文件中的字节数据和隐藏信息

od命令介绍

od(Octal Dump)命令用于将指定文件内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符。od命令系统默认的显示方式是八进制,名称源于Octal Dump。常见的文件为文本文件和二进制文件。od命令可以帮助我们分析文件的内容,检查文件是否包含非法字符,或者查看文件中的隐藏信息。

适用的linux版本

od命令是GNU coreutils软件包中的一个基本命令,几乎所有的linux发行版都自带了这个软件包,所以od命令可以在大多数linux系统中使用。如果你的系统没有安装GNU coreutils软件包,你可以使用以下命令进行安装:

  • 对于基于Debian的系统,如Ubuntu,可以使用sudo apt-get install coreutils命令进行安装。
  • 对于基于Red Hat的系统,如CentOS,可以使用sudo yum install coreutils命令进行安装。

od命令的基本用法

od命令的语法格式如下:

od [选项] [文件...]

其中,选项可以用来指定输出格式、地址基数、跳过字节数、输出宽度等。如果没有指定文件,od命令会从标准输入读取数据。如果指定了多个文件,od命令会依次处理每个文件,并在每个文件的开头输出文件名。

od命令的常用选项说明

od命令有很多选项,这里只介绍一些常用的选项,完整的选项列表可以通过man odod --help查看。

  • -A--address-radix:指定输出地址的基数,可以是d(十进制)、o(八进制)、x(十六进制)或n(无地址)。默认是o(八进制)。
  • -j--skip-bytes:指定跳过输入文件开头的字节数。
  • -N--read-bytes:指定只读取输入文件中的指定字节数。
  • -S--strings:指定只输出长度不小于指定字节数的字符串,默认是3个字节。
  • -t--format:指定输出格式,可以是a(具名字符)、c(ASCII字符或反斜杠转义)、d(有符号十进制)、f(浮点数)、o(八进制)、u(无符号十进制)或x(十六进制)。每种格式后面可以跟一个数字表示每个整数或浮点数占用的字节数。如果没有指定数字,默认是2个字节。如果是f格式,还可以跟F、D或L表示float、double或long double类型。如果在任何格式后面加上z后缀,表示在每行输出末尾显示可打印字符。
  • -v--output-duplicates:指定不省略重复的数据,默认情况下,如果连续两行输出相同,会用一个星号代替第二行。
  • -w--width:指定每行输出的字节数,默认是16个字节。

od命令的实例

下面给出一些od命令的实例,假设有一个名为test.txt的文本文件,内容如下:

Hello, world!
This is a test file.

实例1:使用默认格式输出文件内容

$ od test.txt
0000000 120105 114440 167157 005144 015012 124150 151163 040151
0000020 163040 141001 145163 164040 146151 154145 005056 000012
0000034

这里没有使用任何选项,所以默认输出八进制地址和八进制数据。每个八进制数表示一个字节,每行输出16个字节。

实例2:使用十六进制格式输出文件内容

$ od -t x1 test.txt
0000000 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21 0a 54 68
0000020 69 73 20 69 73 20 61 20 74 65 73 74 20 66 69 6c
0000040 65 2e 0a
0000043

这里使用了-t x1选项,表示以十六进制格式输出,每个整数占用一个字节。可以看到,每个十六进制数对应一个ASCII字符的编码。

实例3:使用ASCII字符格式输出文件内容

$ od -t c test.txt
0000000   H   e   l   l   o   ,       w   o   r   l   d   !  \n   T   h
0000020   i   s       i   s       a       t   e   s   t       f   i   l
0000040   e   .  \n
0000043

这里使用了-t c选项,表示以ASCII字符格式输出。可以看到,文件中的可打印字符都被原样显示,而不可打印字符(如换行符)被用反斜杠转义。

实例4:使用具名字符格式输出文件内容

$ od -t a test.txt
0000000    H    e    l    l    o    , sp    w    o    r    l    d    !
0000020 nl    T    h    i    s sp    i    s sp    a sp    t    e    s
0000040    t sp    f    i    l    e    . nl
0000043

这里使用了-t a选项,表示以具名字符格式输出。可以看到,文件中的可打印字符都被原样显示,而不可打印字符(如空格和换行符)被用缩写表示。

实例5:使用十进制格式输出文件内容,并指定每个整数占用4个字节

$ od -t d4 test.txt
0000000     1819043176     1751606888     -2113896448     -2146959368
0000020     -2080374784     -2139095040     -2113929217     -2146959367
0000040      -335544320      -201326592             -10             -10
0000060             -10             -10             -10             -10
*

这里使用了-t d4选项,表示以有符号十进制格式输出,每个整数占用4个字节。可以看到,文件中的字节被按照小端序(低位在前)组合成四字节的整数,并转换成十进制数。由于文件长度不是4的倍数,所以最后有一些补零。另外,由于有很多重复的-10,所以第二行被用一个星号代替。

实例6:使用浮点格式输出文件内容,并指定每个浮点数占用8个字节

$ od -t fD test.txt
0000000      +1.136e+02      +1.167e+02      +1.198e+02      +1.229e+02
0000020      +1.260e+02      +1.291e+02      +1.322e+02      +1.353e+02
*

这里使用了-t fD选项,表示以浮点格式输出,每个浮点数占用8个字节。可以看到,文件中的字节被按照小端序(低位在前)组合成八字节的浮点数,并转换成科学计数法表示。由于有很多重复的数据,所以第二行被用一个星号代替。这种输出方式可能不太直观,因为文件中的字节并不是浮点数的原始表示。

实例7:使用十六进制格式输出文件内容,并在每行末尾显示可打印字符

$ od -t x1z test.txt
0000000 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21 0a 54 68  >Hello, world!.Th<
0000020 69 73 20 69 73 20 61 20 74 65 73 74 20 66 69 6c  >is is a test fil<
0000040 65 2e 0a                                         >e..<
0000043

这里使用了-t x1z选项,表示以十六进制格式输出,每个整数占用一个字节,并在每行末尾显示可打印字符。可以看到,每行输出被用尖括号包围,并显示对应的ASCII字符。如果有不可打印字符,会用点号代替。

实例8:使用十进制格式输出文件内容,并指定每行输出8个字节

$ od -t d1 -w8 test.txt
0000000   72   69   76   76   79   44   32   87
0000010   79   82   76   68   33   10   84   72
0000020   73   83   32   73   83   32   65   32
0000030   84   69   83   84   32   70   73   76
0000040   69   -2 -10
0000043

这里使用了-t d1 -w8选项,表示以有符号十进制格式输出,每个整数占用一个字节,并指定每行输出8个字节。可以看到,每个十进制数对应一个ASCII字符的编码。由于文件长度不是8的倍数,所以最后有一些补零。

实例9:使用八进制格式输出文件内容,并指定跳过开头的4个字节

$ od -t o1 -j4 test.txt
0000004    ,    w    o    r    l    d    ! \n    T    h    i    s sp
0000024    i    s sp    a sp    t    e    s    t sp    f    i    l    e
0000044    . \n
0000047

这里使用了-t o1 -j4选项,表示以八进制格式输出,每个整数占用一个字节,并指定跳过开头的4个字节。可以看到,文件中的字节被转换成八进制数,并从第5个字节开始显示。

实例10:使用十六进制格式输出文件内容,并指定只读取前面的16个字节

$ od -t x1 -N16 test.txt
0000000:48:65:6c:6c:6f:2c:20:77:6f:72:6c:64:21:0a:54:68

这里使用了-t x1 -N16选项,表示以十六进制格式输出,每个整数占用一个字节,并指定只读取前面的16个字节。可以看到,文件中的前16个字节被转换成十六进制数,并显示在一行中。

od命令的注意事项

  • od命令只能处理文件中的字节数据,不能识别文件中的高级结构或语义。如果要查看或分析特定类型的文件(如图片、音频、视频、文档等),需要使用专门的工具或软件。
  • od命令默认使用小端序(低位在前)来组合多字节的整数或浮点数,这与大多数现代的CPU架构相同。但是,如果要处理一些使用大端序(高位在前)的文件(如网络数据包、Java字节码等),需要使用-E--endian选项来指定字节序。
  • od命令的输出格式可以混合使用,例如-t x1o2d4fD表示以十六进制输出一个字节,以八进制输出两个字节,以十进制输出四个字节,以浮点数输出八个字节。这样可以方便地查看文件中不同类型的数据。

本文链接:https://bashcommandnotfound.cn/article/linux-od-command

0

评论区