用dd跳过stdin的第一个32k?

时间:2013-11-23 10:18:46

标签: bash stdout dd

如果我在文件系统上有文件,我可以使用dd:

执行类似的操作
dd  if=/my/filewithaheader.bin bs=32k skip=1 | gunzip | tar tvf

但是如果我尝试这样的话:

./commandthatputsstuffonstdout |  dd  bs=32k skip=1 | gunzip | tar tvf

我收到错误: dd: 'standard input': cannot skip to specified offset

我该如何解决这个问题,可以用dd完成,还是有另外一个我可以使用的unix命令

3 个答案:

答案 0 :(得分:4)

您可以使用tail。说:

./commandthatputsstuffonstdout | tail -c +1025 ...

跳过命令生成的第一个1024字节输出。

来自man tail

   -c, --bytes=K
          output the last K bytes; alternatively,  use  -c  +K  to  output
          bytes starting with the Kth of each file

答案 1 :(得分:1)

我也遇到过这种情况,使用fullblock iflag可以防止短读和后续中止。

示例:

gzip -d < ./disk_image.dd.gz | \
    dd bs=4M skip=32768 iflag=fullblock,skip_bytes of=./partial_image.dd

答案 2 :(得分:0)

迟到的答案,但这个dd示例对我有用。

创建示例源文件:

$ dd if=/tmp/somefile of=/tmp/test skip=50 bs=100 count=1

跳过50个字节并将其后的10个字节复制到test_skip文件:

$ dd if=/tmp/test of=/tmp/test_skip skip=50 bs=1 count=10
10+0 records in
10+0 records out
10 bytes (10 B) copied, 8.2091e-05 s, 122 kB/s

来自stdin的数据:

cat /tmp/test| dd of=/tmp/stdin bs=1 skip=50 count=1

验证输出:

$ hexdump /tmp/test
0000000 ebf3 e8fd df1b 0aa1 faa3 1fba 1817 1267
0000010 1402 f539 fb69 f263 f319 084b 0b26 1150
0000020 182a f98d 030c e0b0 e47c f13d ef3b 1146
0000030 0b7e 0f72 0e58 f2bd f403 ee95 e529 0567
0000040 f88e 1994 0e83 12e5 11e7 fd4b 032f f4f0
0000050 fc9d 010a 0ab6 06b6 1224 f5cb 01e4 e67a
0000060 ebe0 f1a0                              
0000064

$ hexdump /tmp/test_skip
0000000 0f72 0e58 f2bd f403 ee95

源文件偏移量50是字节:0x0f