Я публикую то, что работает для меня и, кажется, имеет наибольший смысл, после прочтения других, с объяснением. Пара постов была близка, но я пока не могу комментировать (т.к. я новичок):
grep -E -v "(^#.*|^$)" filename
-E
= интерпретировать следующий шаблон как регулярное выражение, аналогично использованию egrep -v
= печатать инверсию шаблона (строки, не соответствующие выражению, будут напечатаны)"(^#.*|^$)"
= здесь есть вертикальная черта, обозначающая оператор ИЛИ. Это выражение говорит печатать любую строку, начинающуюся с#
(и все остальное после нее )ИЛИ любую строку с нулевым символом между началом и концом строки. -v
будет печатать на экране инверсию того, что будет любой строкой с символами, которые не начинаются с #
.
Я обнаружил, что причиной неудачи моего решения было непонимание того, что делает флаг поиска. Это было только смещение места записи на выходном диске. Таким образом, сценарий просто копировал первые 10 ГБ снова и снова на выход. Он никогда не достигнет конца устройства.
Для сдвига ввода необходимо также использовать флаг пропуска:
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress skip=n seek=n
Настройки oflag=seek_bytes
и iflag=skip_bytes
позволяют выполнять математические операции в байтах, а не в блоках.
Однако варианты, представленные roaima (, используют ddrescue )и , что другой парень (split -b 10G < /dev/sdd
), являются лучшим способом восстановления поврежденных дисков и выполнения сегментированных передач соответственно.
Проблема в том, что вы предполагаете, что seek
принимает значение в байтах, тогда как на самом деле он принимает количество блоков. Вы должны использовать seek=0
, 78125
, 156250
и т. д.
Однако вы можете значительно упростить его, избавившись отdd
:
split -b 10G < /dev/sdd