URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10037
[ Назад ]

Исходное сообщение
"Скопировать часть текста от определенной строки до конца файла"

Отправлено qazarus , 12-Сен-15 22:21 
Есть программа, которая пишет инфо о работе в лог. Мне требуется получить часть лога с текущим запуском, текущей работой.

Мне нужно найти последнюю строку с текстом "Program started" (впереди есть еще дата и время), и получить часть лога от этой строки до конца файла.

То есть, у нас есть файл:


Program started
sghsgehuies
ishgoshgoeu
ieshgouishg
Program started
lsehusoehui
selighseigh
Program started
1fidjgiod
2jriojrgjsdo
3iofodihoih

Мне требуется получить:

Program started
1fidjgiod
2jriojrgjsdo
3iofodihoih

То есть участок от последнего совпадения и до конца файла.

Как это сделать уже не знаю, сначала мучал grep, потом пытался сделать это с sed, но его знаю ужасно, по этому не помогло даже двухдневное штудирование манов.


Содержание

Сообщения в этом обсуждении
"Скопировать часть текста от определенной строки до конца файла"
Отправлено Pahanivo , 12-Сен-15 22:56 
в гугле бан?
https://www.google.ru/#newwindow=1&q=sed+%D1%82�...
первая же ссылка
если вдруг:
в браузере нажать ctrl+f и вбить "Печатать часть файла начиная от совпадения с регулярным выражением и до конца файла"

"Скопировать часть текста от определенной строки до конца файла"
Отправлено Pahanivo , 12-Сен-15 23:05 
как сделать чтобы совпадение искалось последнее - на самостоятельное изучение
и было бы очень неплохо прося помочь в разборе текста - приводить кусок оригинала текста
а то пишем что лог со временем, пример без времени почему то ... несхлапывается.

"Скопировать часть текста от определенной строки до конца файла"
Отправлено qazarus , 12-Сен-15 23:18 
> как сделать чтобы совпадение искалось последнее - на самостоятельное изучение
> и было бы очень неплохо прося помочь в разборе текста - приводить
> кусок оригинала текста
> а то пишем что лог со временем, пример без времени почему то
> ... несхлапывается.

Извините, а зачем вы вообще написали?
Ваш совет выглядит так:
Как это сделать ищи сам, и логи пиши рабочие.

Если не знаете, зачем тогда вообще пишите? Любой в гугл отправить сможет, а совет по делу не каждый осилит.
А лог не написал, так как там много рабочей информации, а если мне покажут как сделать с моего примера "лога", я решение уже сам адаптирую.


"Скопировать часть текста от определенной строки до конца файла"
Отправлено Pahanivo , 13-Сен-15 15:44 
> Если не знаете, зачем тогда вообще пишите?

я лишь пытался научить вас пользоваться гуглом - не более



"Скопировать часть текста от определенной строки до конца файла"
Отправлено qazarus , 12-Сен-15 23:15 
> в гугле бан?
> https://www.google.ru/#newwindow=1&q=sed+%D1%82�...
> первая же ссылка
> если вдруг:
> в браузере нажать ctrl+f и вбить "Печатать часть файла начиная от совпадения
> с регулярным выражением и до конца файла"

У меня главная проблема была в том, что я не знаю как отрезать кусок от последнего совпадения, а по ссылкам информация об обрезке от первого. В таком случае мне выбросит весь лог целиком - от первого запуска, до последней строки.


"Скопировать часть текста от определенной строки до конца файла"
Отправлено Square1 , 13-Сен-15 00:54 
>> в гугле бан?
>> 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;}


"Скопировать часть текста от определенной строки до конца файла"
Отправлено Square1 , 13-Сен-15 01:00 
> 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, и потом повторно прогнать лог до нужной строки с которйо начать делать копию прямо в файл...


"Скопировать часть текста от определенной строки до конца файла"
Отправлено Square1 , 13-Сен-15 01:08 
>[оверквотинг удален]
>> @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";


"Скопировать часть текста от определенной строки до конца файла"
Отправлено Etch , 13-Сен-15 00:50 
perl -0pe 's/.*Program started\n/Program started\n/s;' file.txt


"Скопировать часть текста от определенной строки до конца файла"
Отправлено Павел Самсонов , 13-Сен-15 15:46 
>[оверквотинг удален]
>
 
> Program started
> 1fidjgiod
> 2jriojrgjsdo
> 3iofodihoih
>

> То есть участок от последнего совпадения и до конца файла.
> Как это сделать уже не знаю, сначала мучал grep, потом пытался сделать
> это с sed, но его знаю ужасно, по этому не помогло
> даже двухдневное штудирование манов.

Head -n печаает н первых строк
Tail -n печатает н последних строк
N вычисяется grep ом.
Я маны не помню, посмотрите сами.


"Скопировать часть текста от определенной строки до конца файла"
Отправлено pavlinux , 14-Сен-15 03:11 

1. sed '/Program started/{h;d};H;$!d;x' logfile;
2. sed ':a;N;$!ba;s/.*Program started/Program started/g' logfile;


"Скопировать часть текста от определенной строки до конца файла"
Отправлено PavelR , 14-Сен-15 08:03 
> Есть программа, которая пишет инфо о работе в лог. Мне требуется получить
> часть лога с текущим запуском, текущей работой.
> Мне нужно найти последнюю строку с текстом "Program started" (впереди есть еще
> дата и время), и получить часть лога от этой строки до
> конца файла.

Вариант ротировать лог-файл перед запуском программы уже предлагали?


"Скопировать часть текста от определенной строки до конца файла"
Отправлено Andrey Mitrofanov , 14-Сен-15 08:37 
> То есть участок от последнего совпадения и до конца файла.

|tac |sed '/Program started/{p;q}' |tac

Первый `|tac |` => на `tac $file |` будет "быстрее".

> Как это сделать уже не знаю, сначала мучал grep, потом пытался сделать


"Скопировать часть текста от определенной строки до конца файла"
Отправлено greenwar , 14-Сен-15 13:19 
нет чтобы человеку раз и навсегда объяснить, что через БД такое делается, если надо потом сложный поиск
нет, будем погружать дальше в тему костылей

"Скопировать часть текста от определенной строки до конца файла"
Отправлено pavlinux , 16-Сен-15 15:42 
> нет чтобы человеку раз и навсегда объяснить, что через БД такое делается,
> если надо потом сложный поиск

Нукась, изобрази на SQL, выбор из таблицы с теми же условиями?


"Скопировать часть текста от определенной строки до конца файла"
Отправлено Andrey Mitrofanov , 16-Сен-15 16:34 
> Нукась, изобрази на SQL, выбор из таблицы с теми же условиями?

Не, лучче пусть logrotate сделает. С вакуумами-партишонами и шахматами.


"Скопировать часть текста от определенной строки до конца файла"
Отправлено Pahanivo , 17-Сен-15 09:53 
> Не, лучче пусть logrotate сделает. С вакуумами-партишонами и шахматами.

да, времена настали ...
плэйн текст разобрать уже подвиг!


"Скопировать часть текста от определенной строки до конца файла"
Отправлено Andrey Mitrofanov , 17-Сен-15 16:11 
>> Не, лучче пусть logrotate сделает. С вакуумами-партишонами и шахматами.
> да, времена настали ...
> плэйн текст разобрать уже подвиг!

Сейчас воители journald подтянутся -- всё и про текст, и про sql, и про профпригодность старпёров расскажут.


"Скопировать часть текста от определенной строки до конца файла"
Отправлено greenwar , 08-Окт-15 15:21 
>> нет чтобы человеку раз и навсегда объяснить, что через БД такое делается,
>> если надо потом сложный поиск
> Нукась, изобрази на SQL, выбор из таблицы с теми же условиями?

ты серьёзно штоле, дядь, вот это тебе изобразить?
>> Мне нужно найти последнюю строку с текстом "Program started" (впереди есть еще дата и время), и получить часть лога от этой строки до конца файла.

Program started это флаг TINYINT с индексом, поскольку функционал сводится к start/stop/restart/итд
"дата" это TIMESTAMP с индексом
запрос написать или отсюда сам допрёшь?


"Скопировать часть текста от определенной строки до конца файла"
Отправлено qazarus , 10-Фев-16 14:33 
Очень давно не заходил в тему, так как сам нашел невероятно простое решение. Тут-же за это время такого понаписали... Я удивлен, очень удивлен.

Решение:
data=`grep -n 'Program started' /var/log/program.log | sed "s/:.*//" | tail -n 1`
Log=`sed -n $data,'$p' /var/log/program.log`

Финита ля комедия, ага.