Как вы осуществляете детальное управление dd?

Некрасиво, но поместите это в начало оператора sed:

 -e 's/^\([[:alpha:]]+ [[:digit:]]+ [[:digit:]]+:[[:digit:]]+:[[:digit:]]+\).*Subject:\(.*\)/\1\2/'

Или, если вы всегда знаете, что 'почтовый постфикс' будет в тексте в этой позиции, вы можете просто использовать:

 -e 's/^\(.*\) mail postfix.*Subject:\(.*\)/\1\2/'

Возможны и другие варианты. Ключ в том, чтобы зафиксировать дату, пропустить части, которые вам не нужны, и снова зафиксировать остаток, который вам еще нужно обработать. Чтобы захватить объемный звук с помощью \(и \)и распечатать то, что вы записали, используйте \n, где n — позиция конкретного захвата (первое — 1, второе — 2 и т. д.)

И теперь, когда вы знаете это, вы, вероятно, можете выяснить, как исключить все отдельные директивы (-и ), использовать несколько групп захвата и свести все к одному выражению sed.

0
11.09.2019, 02:19
1 ответ

Мало возможностей:

  1. Используйте меньший bs, но не очень маленький:

    dd if=/dev/sdb of=new_image.img bs=512k count=30387
    

    Это не общее решение. Здесь это работает, потому что 15931539456можно разложить на множители.

  2. Используйте нужный bs, читайте больше и усекайте на лету:

    dd if=/dev/sdb bs=4M | head -c 15931539456 >new_image.img
    

    Здесь не нужно count=3799. Ну и не надоdd:

    head -c 15931539456 /dev/sdb >new_image.img
    

    Я ожидаю, что headбудет читать нормальные фрагменты и работать хорошо. Примечание head -cне требуется POSIX.

  3. Используйте желаемое bs, прочитайте больше и сократите позже:

    dd if=/dev/sdb of=new_image.img bs=4M count=3799
    truncate -s 15931539456 new_image.img
    
    Однако

    truncateне является переносимым.

  4. Используйте желаемое bs, читайте меньше; затем прочитайте оставшуюся часть с помощьюbs=1:

    dd if=/dev/sdb of=new_image.img bs=4M count=3798
    offset=$((3798*4*1024*1024))
    remaining=$((15931539456-offset))
    dd if=/dev/sdb of=new_image.img bs=1 skip="$offset" seek="$offset" count="$remaining"
    

Обратите внимание, что в целом ddможет считывать неполный блок, и это все равно увеличивает счет (сравните этот ответ). При чтении с блочного устройства этого, вероятно, не произойдет, но общее решение состоит в том, чтобы всегда указывать iflag=fullblockвсякий раз, когда вы полагаетесь на countи bsбольше, чем 1. К сожалению, fullblockне требуется POSIX,так что ваш ddможет не поддерживать его.

4
28.01.2020, 02:17

Теги

Похожие вопросы