Помощь по скрипту Bash — анализ и вывод текста

Помощь по скрипту Bash — анализ и вывод текста

У меня есть текстовый файл следующего типа:

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.

Связанный контент