【问题标题】:get a part of a binary file using gnu-coreutils, bash使用 gnu-coreutils、bash 获取二进制文件的一部分
【发布时间】:2024-01-06 14:22:01
【问题描述】:

我想得到一个二进制文件的一部分,从字节#480161397到#480170447(包括,共9051字节)

我使用cut -b,我预计trunk1.gz 的大小为9051 字节,但我得到了不同的结果。

$ wget https://commoncrawl.s3.amazonaws.com/crawl-data/CC-MAIN-2016-07/segments/1454701152097.59/warc/CC-MAIN-20160205193912-00264-ip-10-236-182-209.ec2.internal.warc.gz

$ cut -b480161397-480170447 CC-MAIN-20160205193912-00264-ip-10-236-182-209.ec2.internal.warc.gz >trunk1.gz

$ echo $((480170447-480161397+1))
9051

$ ls -l trunk1.gz
-rw-r--r--  1 david  staff     3400324 Sep  8 10:28 trunk1.gz

怎么了?

【问题讨论】:

  • 如果你做一个wc -c trunk1.gz,你会得到什么?
  • 3400324 trunk1.gz
  • 这意味着您的剪辑没有按照您的想法进行。我尝试了cut -b 和一些我也拥有的.gz 文件。我的文件大小也比指定的 bbytes 大。在普通文件中,这可以通过文件中有列的事实来解释。所以命令cut -b 从每一行中挑选出相应的字节。因此文件大小很大。即cut -b 可能不是您在这里需要的。

标签: linux bash gnu-coreutils


【解决方案1】:

cut -bN-M 从输入的每一行复制N-M字节范围。

示例

$ cut -b4-7 <<END
0123456789
abcdefghij
ABCDEFGHIJ
END

输出

3456
defg
DEFG

考虑将dd 用于您的目的。

【讨论】:

    【解决方案2】:

    如果您使用二进制文件,我建议您使用dd 命令。

    dd if=trunk1.gz bs=1 skip=480161397 count=9051 of=output.bin
    

    bs 是块大小,设置为 1 字节。

    【讨论】:

    • dd if=CC-MAIN-20160205193912-00264-ip-10-236-182-209.ec2.internal.warc.gz bs=1 skip=$((480161397-1)) count=9051 of=trunk1.gz
    最近更新 更多