
У меня есть текстовый файл следующего типа:
a b c d
-- -- -- --
1 ok device issue Some Action which
has to be taken which
is split into many lines
under d.
Я пробовал использовать grep для "issue", однако выводится только первая строка 'd'. Вывод, который я получил, следующий:
1 ok device issue Some Action which
Однако мне нужен полный вывод в d. Когда я попытался сохранить файл в csv, он показал вторую строку столбца d как новую строку.
Редактировать:
Выходные данные получены с нескольких устройств и сохранены в переменной, из которой я выбираю то, на котором возникли проблемы.
решение1
Здесь вам понадобится многострочный grepping. Для этого нам понадобится включенная -P
опция PCRE. Поскольку grep выводит записи с разделителями Null в -z
режиме slurp, мы удаляем их с помощью команды tr.
$ < file grep -Pzo '.*\S.*issue.*\n(?:\h+.*\n)+' | tr -d '\0'
решение2
grep
действует как положено в режиме по умолчанию. С его man
страницы:
...grep ищет ШАБЛОНЫ в каждом ФАЙЛЕ. ШАБЛОНЫ — это один или несколько шаблонов, разделенных символами новой строки, и grep выводит каждую строку, которая соответствует шаблону...
Итак, он должен появитьсялиниив тексте, соответствующем a regex
. Строки разграничены кодом newline
управления, который объясняет поведение, которое вы видите. Кроме использования опции, -z
упомянутой в ответах. Предполагая, что «issue» — это регулярное выражение, которое вы хотите сопоставить (замените на 'Device Degraded'
или '\sDegraded'
или '\sError'
, если это то, что вы на самом деле хотите сопоставить); и что столбец «Corrective Action» сгенерирован машиной и последователен, т. е. всегда охватывает 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, чтобы узнать больше о том, что делают эти параметры.
решение3
Предположим, что «запись» во входном файле точно такая, как указано в OP:
$ 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.
$
решение4
Это может быть то, что вам нужно, используя любой awk в любой оболочке на любой машине UNIX:
$ cat tst.awk
/^[0-9]/ { prt() }
{ rec = rec $0 ORS }
END { prt() }
function prt() {
if ( rec ~ regexp ) {
printf "%s", rec
}
rec = ""
}
.
$ awk -v regexp='issue' -f tst.awk file
1 ok device issue Some Action which
has to be taken which
is split into many lines
under d.