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);
Обновлено:
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 строк мы сбрасываем счетчик и процесс повторяется.
Вы можете выбрать любой блок от «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'