Использование awk
вместоgrep
:
awk '/FOO/ { if (matching) printf("\n"); matching = 1 }
/^$/ { if (matching) printf("\n"); matching = 0 }
matching' file
Версия, которая перечисляет совпадения:
awk 'function flush_print_maybe() {
if (matching) printf("Match %d\n%s\n\n", ++n, buf)
buf = ""
}
/FOO/ { flush_print_maybe(); matching = 1 }
/^$/ { flush_print_maybe(); matching = 0 }
matching { buf = (buf == "" ? $0 : buf ORS $0) }
END { flush_print_maybe() }' file
Обе awk
программы используют очень простой «конечный автомат», чтобы определить, соответствует ли он в данный момент или нет. Совпадение шаблона FOO
приведет к переходу в состояние matching
, а совпадение шаблона^$
(с пустой строкой )приведет к переходу в состояние, отличное от -matching
.
Вывод пустых строк между совпадающими наборами данных происходит при переходах состояний изmatching
(либо в matching
, либо в не-matching
).
Первая программа печатает любую строку в состоянии matching
.
Вторая программа собирает строки в переменной buf
, когда находится в состоянии matching
. Он сбрасывает (очищает )это после возможной печати (в зависимости от состояния )вместе с меткой Match N
при переходах между состояниями (, когда первая программа выводит пустую строку ).
Вывод этой последней программы на примере данных:
Match 1
this line contains FOO
this line is not blank
Match 2
This line also contains FOO
Match 3
This line contains FOO too
Not blank
Also not blank
Match 4
FOO!
Yet more random text
Match 5
FOO!
Анализ
ntfsfix -n /dev/sda5
параметр n
заставит инструмент выводить решение для восстановления, не применяя его (будьте очень осторожны при использовании такого инструмента, поскольку автоматизированные инструменты восстановления могут выбрать неправильное решение для восстановления раздела)
ntfsresize -if /dev/sda5
это скажет нам, что именно происходит...
Резервное копирование
В первую очередь, прежде чем что-либо делать, рекомендуется сделать полную резервную копию образа... в противном случае просто сделайте резервную копию таблицы разделов с помощью
sfdisk -d /dev/sda > sda.partition.table.txt
Пояснение
В данном конкретном случае Failed to read last sector (345345...)
это означает, что раздел больше, чем указано в таблице разделов, это может произойти при изменении размера раздела (уменьшении )без сжатия файла -системы (ntfs здесь )... решение состоит в том, чтобы отменить изменение размера (в таблице разделов )... Обратите внимание, что ntfsfix
может угадать старое доброе значение и восстановить его , НО инструмент также может угадать неправильное значение и привести к потере части/всех ваших данных... если раздел можно смонтировать после ремонт, который не означает, что вы не потеряли данные, особенно когда chkdsk
исправляет много ошибок...
Решение
Сделайте резервную копию текущей таблицы разделов с помощьюsfdisk -d /dev/sda > sda.partition.table.txt
Failed to read last sector (345345...)
указывают, что реальный конечный сектор раздела равен [start.sector]+[345345...]
, поэтому нам нужно рассчитать реальное расположение конечного сектора, добавив начальный сектор раздела и последний сектор, показанный в ошибке
Отредактируйте sda.partition.table.txt и замените конечный сектор новым рассчитанным... (для sda5)
Восстановите таблицу разделов с помощьюsfdisk /dev/sda < sda.partition.table.txt