Запись диапазона строк в файл (от 1 до N) Сценарий Bash, Awk или Sed

btrfs replaceдействительно нужно попробовать, но есть две ошибки, связанные с его вызовом :он будет показывать ошибки только при использовании -B(, в противном случае он завершится со статусом 0, как будто все в порядке, но вы' вы увидите «никогда не запускалось», когда вы проверите статус ), а недопустимые параметры вызовут несвязанные ошибки.

Например, я думаю, что с моим диском все в порядке, но RAID1 каким-то образом рассинхронизировался (вероятно, из-за отключения электроэнергии, во время которого хост выжил, но диски не получают резервного питания и могли подключиться к сети в несколько разное время. ). Чтобы проверить, когда я отключаю питание диска B (во время монтирования ), я могу нормально читать данные. Когда я вместо этого выключаю диск A (, диск B включается, а файловая система уже смонтирована ), тогда я получаю ошибки и повреждаю данные. Итак, ясно, что диск A в порядке, а диск B поврежден. Но диск B работает, поэтому я хочу -использовать его и просто восстановить. Поэтому я хочу заменить /dev/diskBна /dev/diskB.

Когда я использовал btrfs replace start -B /dev/diskB /dev/diskB /mnt/btrfs, он показал мне ERROR: ioctl(DEV_REPLACE_START) failed on "/mnt/btrfs": Invalid argument, <illegal result value>. Значит, проблема с точкой монтирования, верно? Нет, когда я изменил первый /dev/diskBна /dev/diskA, это просто сработало. Ошибка была в устройствах, а не в точке монтирования.

Точно так же я вижу, что первый аргумент(2)немного странный. Возможно, ошибка неверна, и он будет работать с устройством вместо 2?

btrfs replaceимеет два режима работы :один, в котором вы используете неисправное устройство в качестве первого аргумента (после start -Bили любого другого ), и режим (, если первый вариант недоступен ), где вы используете рабочее устройство для копирования.В любом случае вторым аргументом является диск, который вы хотите использовать для перестроения.

Не имеет значения, смонтирована ли файловая система для чтения -только для чтения или для чтения -для записи. Вот почему я подозреваю, что он отвергает ваши аргументы и дает вам неправильную ошибку, а не правильную ошибку.

0
15.01.2020, 02:43
5 ответов

head кажется лучшим инструментом для работы:

head -n "$N" input.txt > input.log

С помощью sedвам нужно указать команду; исходя из вашего подхода, это будет команда pи опция -n, поэтому она не печатает пространство шаблона по умолчанию:

sed -n "1,${N}p" input.txt > input.log

но

sed "$N q" input.txt > input.log

было бы более эффективно, только читая первые Nстроки и останавливая (, что также делает head)вместо чтения всего файла (, что делает sed "1,${N}p")].

Эти подходы дают один и тот же результат только для Nбольших или равных 1; если он меньше 1, поведение будет отличаться.

5
28.01.2020, 02:14

Будет

sed "${N}q" file

делать то, что вам нужно?

1
28.01.2020, 02:14

Другие возможности

sed -n ''"$N"',$ !p' file

sed '1,'"$N"' !d' file

awk 'FNR <= '"$N"'' file

perl -ne'1..'"$N"' and print' file
0
28.01.2020, 02:14

Для строк от M до N (при условии, что M <= N):

head -n N input.txt | tail -n $(( N - M + 1))

или

cat input.txt | head -n N | tail -n $(( N - M + 1))

Последняя форма может использоваться для любого потока.

1
28.01.2020, 02:14

Использование двойных кавычек означает «без кавычек», что упрощает задачу:

head -$N ex
sed "$N q" ex
sed -n "1,$N p" ex
awk "NR <= $N" ex
perl -ne "print if $. <= $N" ex
grep -m $N. ex
0
28.01.2020, 02:14

Теги

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