У меня есть основания полагать, что рабочей awk
командой является
awk -v count=3 '/DS:/ {$NF=((c++ % count) + 1)} 1' input
где input
— входной файл. Также я думаю, что во входном файле должно быть 9 строк вместо 7, чтобы сгенерировать вывод, указанный в вопросе.
Вот как это работает.
Во-первых, опция -v count=3
назначает 3
переменнойawk
count
. Если бы это было написано так, как написано в вопросе(count=3
в конце команды ), 3
было бы присвоено переменной оболочки и не было бы доступно для awk
. ] и приведет к ошибке деления на ноль, поскольку count
будет неявно инициализирован как 0
.
В
/DS:/ {$NF=((c++ % count) + 1)}
Часть /DS:/
является условием для блока в фигурных скобках. Это регулярное выражение DS:
, которое может соответствовать только строке DS:
. Этому условию соответствуют все строки, содержащие DS:
.
Для всех этих строк переменная c
увеличивается, а затем берется модуль count
. Поскольку у нас нет явного определения переменной c
, она неявно инициализируется значением 0
при первом выполнении этого блока кода.
Затем результат добавляется с помощью 1
и присваивается $NF
. Здесь NF
— количество полей в строке, разделенных разделителями полей. Разделителем полей по умолчанию(FS
)является пробел. Обратите внимание, что пробел как FS
является особым случаем в awk
, и несколько последовательных пробелов будут рассматриваться только как один разделитель полей.
Поскольку NF
— это количество полей, $NF
относится к последнему полю. В этом случае присваивание $NF
приводит к замене 1
значением, полученным путем вычисления ((c++ % count) + 1)
.
Конечная 1
обозначает истинное условие, а кодовый блок после него опускается. Эффект этого является неявным print
, когда условие истинно. Поскольку 1
всегда истинно, действие всегда выполняется и печатается текущая строка,возможно после трансформации последнего блока.
Чтобы лучше понять процесс, мы можем отслеживать выполнение awk
. awk
имеет неявный цикл, который перебирает строки ввода.
1-я строка:c
неявно назначается 0
. c++
все еще 0
, но это изменяет c
на 1
, (c++ % count)
равно 0
по модулю 3
, так что 0
, ((c++ % count)+1)
это 1
, назначение изменяет последнее поле (, который также является последним символом в этом случае от )до 1
, и окончательный 1
печатает эту строку, так что мы получаем DS: 1
.
2-я строка:c
теперь 1
. ((c++ % count)+1)
это 2
и меняется c
к 2
. Последнее поле изменяется на 2
и печатается, поэтому мы получаем DS: 2
.
3-я строка :Аналогично ((c++ % count)+1)
заменяет c
на 3
и оценивается как 3
. Получаем DS: 3
.
4-я строка :Вот когда %
действительно вступает в силу. (c++
%count)
равно 3
по модулю 3
, что равно 0
, и ((c++%count)+1)
снова оценивается как 1
. Получаем DS: 1
.
И так далее. Вот как это работает. Обратите внимание, что если есть строки без DS:
, они печатаются дословно.
Повреждена файловая система корневого логического тома, а не само устройство LUKS. /dev/sda5
— это раздел, содержащий устройство шифрования LUKS/dm -с шифрованием (, а также LVM, который вы также используете ), хранилище работает слоями, вы не можете запустить fsck
на Уровень шифрования LUKS (), в вашем случае вы должны запустить его на уровне логического тома LVM --/dev/mapper/trisquel--vg-root
.
Если вы запускаете это из initramfs, где устройство LUKS уже разблокировано (вы указали парольную фразу ранее ), вам нужно запустить fsck /dev/mapper/trisquel--vg-root
. Если вы запускаете это с LiveCD, вам нужно сначала вручную разблокировать зашифрованный диск (, вы можете сделать это просто из графического интерфейса, дважды щелкнув зашифрованный диск, или вручную с помощью cryptsetup ), а затем запустить ту же команду fsck /dev/mapper/trisquel--vg-root
.
Вы пытаетесь ошибиться.Fsck считает, что раздел зашифрован LUKS. Судя по фото, вы тоже используете LVM.
Итак, я предполагаю, что у вас есть физический том LVM, зашифрованный с помощью LUKS.
На фото видно, что вы попали в аварийный корпус. Я подозреваю, что когда это происходит, зашифрованный диск был разблокирован, а группа томов (и логический том )уже сопоставлены...
... поэтому вы должны иметь возможность fsck логического тома из аварийной оболочки:
fsck /dev/mapper/trisquel--vg-root