Есть программа, которая пишет инфо о работе в лог. Мне требуется получить часть лога с текущим запуском, текущей работой.Мне нужно найти последнюю строку с текстом "Program started" (впереди есть еще дата и время), и получить часть лога от этой строки до конца файла.
То есть, у нас есть файл:
Program started
sghsgehuies
ishgoshgoeu
ieshgouishg
Program started
lsehusoehui
selighseigh
Program started
1fidjgiod
2jriojrgjsdo
3iofodihoih
Мне требуется получить:
Program started
1fidjgiod
2jriojrgjsdo
3iofodihoih
То есть участок от последнего совпадения и до конца файла.Как это сделать уже не знаю, сначала мучал grep, потом пытался сделать это с sed, но его знаю ужасно, по этому не помогло даже двухдневное штудирование манов.
в гугле бан?
https://www.google.ru/#newwindow=1&q=sed+%D1%82...
первая же ссылка
если вдруг:
в браузере нажать ctrl+f и вбить "Печатать часть файла начиная от совпадения с регулярным выражением и до конца файла"
как сделать чтобы совпадение искалось последнее - на самостоятельное изучение
и было бы очень неплохо прося помочь в разборе текста - приводить кусок оригинала текста
а то пишем что лог со временем, пример без времени почему то ... несхлапывается.
> как сделать чтобы совпадение искалось последнее - на самостоятельное изучение
> и было бы очень неплохо прося помочь в разборе текста - приводить
> кусок оригинала текста
> а то пишем что лог со временем, пример без времени почему то
> ... несхлапывается.Извините, а зачем вы вообще написали?
Ваш совет выглядит так:
Как это сделать ищи сам, и логи пиши рабочие.Если не знаете, зачем тогда вообще пишите? Любой в гугл отправить сможет, а совет по делу не каждый осилит.
А лог не написал, так как там много рабочей информации, а если мне покажут как сделать с моего примера "лога", я решение уже сам адаптирую.
> Если не знаете, зачем тогда вообще пишите?я лишь пытался научить вас пользоваться гуглом - не более
> в гугле бан?
> https://www.google.ru/#newwindow=1&q=sed+%D1%82...
> первая же ссылка
> если вдруг:
> в браузере нажать ctrl+f и вбить "Печатать часть файла начиная от совпадения
> с регулярным выражением и до конца файла"У меня главная проблема была в том, что я не знаю как отрезать кусок от последнего совпадения, а по ссылкам информация об обрезке от первого. В таком случае мне выбросит весь лог целиком - от первого запуска, до последней строки.
>> в гугле бан?
>> https://www.google.ru/#newwindow=1&q=sed+%D1%82...
>> первая же ссылка
>> если вдруг:
>> в браузере нажать ctrl+f и вбить "Печатать часть файла начиная от совпадения
>> с регулярным выражением и до конца файла"
> У меня главная проблема была в том, что я не знаю как
> отрезать кусок от последнего совпадения, а по ссылкам информация об обрезке
> от первого. В таком случае мне выбросит весь лог целиком -
> от первого запуска, до последней строки.open(TT,"t.t");
@arr=();
while($r=<TT>){
if ($r=~/Program started/){@arr=();}
push(@arr,$r);
}foreach $r(@arr){print $r;}
> open(TT,"t.t");
> @arr=();
> while($r=<TT>){
> if ($r=~/Program started/){@arr=();}
> push(@arr,$r);
> }
> foreach $r(@arr){print $r;}Конечно, если между Program started логи достигают гигабайтов- такой алгоритм будет накладным. Тогда можно например не копировать полностью строки, а только запомнить номер строки когда встретился Program started, и потом повторно прогнать лог до нужной строки с которйо начать делать копию прямо в файл...
>[оверквотинг удален]
>> @arr=();
>> while($r=<TT>){
>> if ($r=~/Program started/){@arr=();}
>> push(@arr,$r);
>> }
>> foreach $r(@arr){print $r;}
> Конечно, если между Program started логи достигают гигабайтов- такой алгоритм будет накладным.
> Тогда можно например не копировать полностью строки, а только запомнить номер
> строки когда встретился Program started, и потом повторно прогнать лог
> до нужной строки с которйо начать делать копию прямо в файл...Например так:
open(TT,"t.t");
$countg=0;
$countstring=0;while($r=<TT>){
$countg++;
if ($r=~/Program started/){$countstring=$countg;}
}$lines=$countg-$countstring;
print "сделать: tail -n $lines t.t\n";
perl -0pe 's/.*Program started\n/Program started\n/s;' file.txt
>[оверквотинг удален]
>
> Program started
> 1fidjgiod
> 2jriojrgjsdo
> 3iofodihoih
>
> То есть участок от последнего совпадения и до конца файла.
> Как это сделать уже не знаю, сначала мучал grep, потом пытался сделать
> это с sed, но его знаю ужасно, по этому не помогло
> даже двухдневное штудирование манов.Head -n печаает н первых строк
Tail -n печатает н последних строк
N вычисяется grep ом.
Я маны не помню, посмотрите сами.
1. sed '/Program started/{h;d};H;$!d;x' logfile;
2. sed ':a;N;$!ba;s/.*Program started/Program started/g' logfile;
> Есть программа, которая пишет инфо о работе в лог. Мне требуется получить
> часть лога с текущим запуском, текущей работой.
> Мне нужно найти последнюю строку с текстом "Program started" (впереди есть еще
> дата и время), и получить часть лога от этой строки до
> конца файла.Вариант ротировать лог-файл перед запуском программы уже предлагали?
> То есть участок от последнего совпадения и до конца файла.|tac |sed '/Program started/{p;q}' |tac
Первый `|tac |` => на `tac $file |` будет "быстрее".
> Как это сделать уже не знаю, сначала мучал grep, потом пытался сделать
нет чтобы человеку раз и навсегда объяснить, что через БД такое делается, если надо потом сложный поиск
нет, будем погружать дальше в тему костылей
> нет чтобы человеку раз и навсегда объяснить, что через БД такое делается,
> если надо потом сложный поискНукась, изобрази на SQL, выбор из таблицы с теми же условиями?
> Нукась, изобрази на SQL, выбор из таблицы с теми же условиями?Не, лучче пусть logrotate сделает. С вакуумами-партишонами и шахматами.
> Не, лучче пусть logrotate сделает. С вакуумами-партишонами и шахматами.да, времена настали ...
плэйн текст разобрать уже подвиг!
>> Не, лучче пусть logrotate сделает. С вакуумами-партишонами и шахматами.
> да, времена настали ...
> плэйн текст разобрать уже подвиг!Сейчас воители journald подтянутся -- всё и про текст, и про sql, и про профпригодность старпёров расскажут.
>> нет чтобы человеку раз и навсегда объяснить, что через БД такое делается,
>> если надо потом сложный поиск
> Нукась, изобрази на SQL, выбор из таблицы с теми же условиями?ты серьёзно штоле, дядь, вот это тебе изобразить?
>> Мне нужно найти последнюю строку с текстом "Program started" (впереди есть еще дата и время), и получить часть лога от этой строки до конца файла.Program started это флаг TINYINT с индексом, поскольку функционал сводится к start/stop/restart/итд
"дата" это TIMESTAMP с индексом
запрос написать или отсюда сам допрёшь?
Очень давно не заходил в тему, так как сам нашел невероятно простое решение. Тут-же за это время такого понаписали... Я удивлен, очень удивлен.Решение:
data=`grep -n 'Program started' /var/log/program.log | sed "s/:.*//" | tail -n 1`
Log=`sed -n $data,'$p' /var/log/program.log`Финита ля комедия, ага.