Недавно у меня была такая же проблема с флешкой.
Что я сделал, кроме проверки разрешения и т. д.
Это сработало для меня без чего-то столь же экстремального -форматирования диска.
grep
работает так, как должно в режиме по умолчанию. Со страницы man
:
...grep searches for PATTERNS in each FILE. PATTERNS is one or more patterns separated by newline characters, and grep prints each line that matches a pattern...
Таким образом, должно появиться строк в тексте, соответствующем regex
. Линии разграничены управляющим кодом newline
, который объясняет поведение, которое вы видите. Кроме использования опции -z
, упомянутой в ответах. Предполагая, что «проблема» — это регулярное выражение, которому вы хотите сопоставить (, замените на 'Device Degraded'
или '\sDegraded'
или '\sError'
, если это то, что вы действительно хотите сопоставить ); и что столбец «Корректирующее действие» генерируется машиной и согласован, т. Е. Всегда занимает 4 строки, вы также можете просто запустить grep -A 3 '\sissue' > issues
, чтобы сохранить только те строки, которые вас интересуют , в файл. Вы должны иметь возможность генерировать вывод, который выглядит как:
1 ok device issue Some Action which
has to be taken which
is split into many lines
under d.
--
10 ok device issue Some Action which
has to be taken which
is split into may lines
under d.
--
211 ok device issue Some Action which
has to be taken which
is split into many lines
under d.
проверьте справочную страницу grep, чтобы узнать больше о том, что делают эти опции.
Здесь вам понадобится многострочный поиск. Для чего нам понадобится включенный PCRE -P
вариант. Поскольку grep будет выводить записи с разделителями Null в режиме slurp -z
, мы удаляем их с помощью команды tr.
$ < file grep -Pzo '.*\S.*issue.*\n(?:\h+.*\n)+' | tr -d '\0'
Предполагая, что «запись» во входном файле точно соответствует ОП:
$ sed '/issue/!d; :a; n; /^[0-9]\{1,\} /d; $!ba' file
1 ok device issue Some Action which
has to be taken which
is split into many lines
under d.
$