Por que o segundo comando gera um valor diferente?
Por motivos históricos, dd
considera x
como operador de multiplicação. Então, 0x3
é avaliado como 0.
É possível passar o deslocamento skip | seek para dd como um valor hexadecimal?
Não diretamente, tanto quanto eu sei. Além da multiplicação usando o operador x
, você pode sufixar qualquer número com b
para significar "multiplicar por 512" (0x200) e com K
para "multiplicar por 1024" (0x400). Com o GNU dd você também pode usar os sufixos M
, G
, T
, P
, E
, Z
e Y
para significar multiplicar por 2 à potência de 20, 30, 40, 50, 60, 70, 80 ou 90, respectivamente, e você pode usar maiúsculas ou minúsculas, exceto o sufixo b
. (Existem muitos outros sufixos possíveis. Por exemplo, EB
significa "multiplicar por 10 18 " e PiB
significa "multiplicar por 2 50 ". Consulte info coreutils "block size"
para mais informações, se você tiver uma instalação GNU.)
Você pode achar o acima arcano, anacrônico e nerd ao ponto do absurdo. Não se preocupe: você não está sozinho. Felizmente, você pode simplesmente ignorar tudo e usar a substituição aritmética do seu shell (bash e outros shells compatíveis com Posix funcionarão, assim como alguns shells não Posix). O shell entende números hexadecimais e permite uma gama completa de operadores aritméticos escritos da maneira normal. Você só precisa cercar a expressão com $((...))
:
# dd if=2013-Aug-uptime.csv bs=1 count=$((0x2B * 1024)) skip=$((0x37))