Как выполнить поиск блока текста, содержащего определенные слова в нескольких строках? И как я могу сделать, чтобы это было передано из хвоста -f?

PhantomJS может сделать эту работу за вас. Он имеет функциональность командной строки и работает из коробки. Вам потребуется написать простую функцию Javascript, чтобы сообщить ей, что делать. На сайте есть краткое руководство и множество статей в Интернете, которые помогут вам. Обычно используется следующее:

phantomjs configFile.js htmlFile.html output.pdf

Вот пример скрипта для создания портретного PDF-файла формата A4, взятого из здесь , сохраните как ваш configFile.js

var page = require('webpage').create(),
    system = require('system'),
    fs = require('fs');

page.paperSize = {
    format: 'A4',
    orientation: 'portrait',
    margin: {
        top: "1.5cm",
        bottom: "1cm"
    },
    footer: {
        height: "1cm",
        contents: phantom.callback(function (pageNum, numPages) {
            return '' +
                '
' + '
' + ' REPORT FOOTER ' + ' ' + pageNum + ' / ' + numPages + '' + '
' + '
'; }) } }; page.settings.dpi = "96"; page.content = fs.read(system.args[1]); var output = system.args[2]; window.setTimeout(function () { page.render(output, {format: 'pdf'}); phantom.exit(0); }, 2000);

0
14.09.2021, 02:27
2 ответа

Обновлено:

tail -f log | sed '/\n/!N;N;/\nABC$/!D;N;N;N;N;N;N;/ZZZ/d'

Отображает строку, соответствующую шаблону ABC, 2 предшествующих и 6 следующих, если у них нет шаблонаZZZ

В буфере всегда 3 строки. Проверяем последний. Если совпадений нет, удалите первое и переместите выполнение в начало скрипта. Если есть совпадение, добавьте еще 6 строк. Решение о печати принимается из матча по шаблону ZZZ.

Несоответствие:
Предположим, шаблон XYZдолжен соответствовать концу блока записи. Затем:

tail -f | sed ':1;N;/XYZ/!b1;/ZZZ/d'

Я не вижу здесь необходимости в небуферизованном выводе, но флаг -uобеспечивает эту возможность в потоковом редакторе sed.

Также можно ввести шаблон для начала блока записи:

tail -f | sed '/TIMESTAMP/!d;:1;N;/XYZ/!b1;/ZZZ/d'

Приведенные выше скрипты добавляют в буфер редактора SED (пространство шаблонов )все строки от начала записи до конца и производят сопоставление с шаблоном ZZZ, в результате чего определяется удаление всю запись или печать.

Другой вариант, если блоки журнала содержат одинаковое количество строк,тогда их можно считать и отображать ровно столько, сколько нужно, как в вашей попытке с egrep.
Давайте выберем символ плюс + в качестве счетчика. В этом примере мы будем считать до пяти, но вы можете изменить это в этом шаблоне-+\{5\}:

tail -f log | sed ':1;x;s/$/+/;/+\{5\}/!{x;N;b1};s/.*//;x'

Так же можно добавить начало аккаунта и удалить по шаблону:

tail -f log | sed '/TIMESTAMP/!d;:1;x;s/$/+/;/+\{5\}/!{x;N;b1};s/.*//;x;/ZZZ/d'

Счетчик работает следующим образом. Редактор SED имеет два буфера -пространства шаблонов и пространства хранения. Строка записывается в пространство шаблонов. Команда xменяет содержимое обоих буферов и мы пишем плюсик в конце холд спейса и проверяем их количество если шаблон совпадает с 5 плюс печатаем содержимое, иначе добавляем следующую строку и увеличиваем счетчик. После совпадения 5 строк мы сбрасываем счетчик и процесс повторяется.

0
14.09.2021, 06:40

Вы можете выбрать любой блок от «TIMESTAMP» до «XYZ» и ввести NUL в качестве разделителя после блока с помощью sed, а затем просеять с помощью других инструментов, например. grepи удалить байт NUL в конце:

tail -f file |
  sed -n '/TIMESTAMP/,/XYZ/{/XYZ/s/$/\x00/;p}' |
  grep -z 'ABC' |
  grep -z -v 'ZZZ' |
  tr -d '\x00'
0
14.09.2021, 08:09

Теги

Похожие вопросы