如果我有一个二进制文件,或者一些带有原始二进制输出的命令,并且我正在寻找一个 shell (bash) 命令来裁剪数据的特定部分,即具有给定的开始和长度或以字节为单位的结束偏移量。
例如,假设file.bin
contains abcdefghijk
,我会这样做:
cat file.bin | crop 5 3
为了表明我只想保留偏移量 5 中长度为 3 的部分,因此此示例将输出fgh
.
我知道有cut
命令,但它适用于文本内容并逐行处理输入。就我而言,我通常处理二进制数据,因此没有线的概念。我只想指定要以字节为单位裁剪的部分。
有二进制替代方案cut
吗?
dd
会这样做。如果需要一个字节的粒度,则必须将块大小设置为 1:cat file.bin | dd bs=1 skip=5 count=3
POSIX
tail
with-c
可以处理任意数据。不幸的是, POSIXhead
不能。当仅限于 POSIX 时,您需要dd
; 要么像这样:或者像这样:
bs=1
可能是次优的,但即使您的skip=
和count=
可以重新计算到更大bs=
,只有 POSIXdd
才bs=1
适合您。GNU
dd
支持iflag=fullblock
在更大的情况下可能会有所帮助bs=
。在您使用 GNUdd
的情况下,更好的选择是iflag=skip_bytes,count_bytes
:上面的命令使用默认值
bs=512
,尽管 5 和 3 都不是 512 的倍数,但它仍然有效。该命令应该适用于任何 sanebs=
。如果您
head
支持-c
计算字节数,那么在此模式下读取时它很可能不会等待整行。这导致以下方法:可能还有其他解决方案。请注意,如果
command1
打印其输入的前 5 个字节并command2
打印其输入的前 3 个字节,则可能会也可能不会。通常
command1
可能读取超过5 个字节(并且仍将 5 打印到其标准输出),因此当command2
开始读取时,指针可能位于错误的位置。我给你的命令不遵循这种潜在的缺陷模式。