The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Скопировать часть текста от определенной строки до конца файла"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"Скопировать часть текста от определенной строки до конца файла"  –1 +/
Сообщение от qazarus email on 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, но его знаю ужасно, по этому не помогло даже двухдневное штудирование манов.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

2. "Скопировать часть текста от определенной строки до конца файла"  +/
Сообщение от Pahanivo (ok) on 12-Сен-15, 23:05 
как сделать чтобы совпадение искалось последнее - на самостоятельное изучение
и было бы очень неплохо прося помочь в разборе текста - приводить кусок оригинала текста
а то пишем что лог со временем, пример без времени почему то ... несхлапывается.
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

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

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

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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

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

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


Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

6. "Скопировать часть текста от определенной строки до конца файла"  +/
Сообщение от Square1 on 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;}

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

7. "Скопировать часть текста от определенной строки до конца файла"  +/
Сообщение от Square1 on 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, и потом повторно прогнать лог до нужной строки с которйо начать делать копию прямо в файл...

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "Скопировать часть текста от определенной строки до конца файла"  +/
Сообщение от Square1 on 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";

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

11. "Скопировать часть текста от определенной строки до конца файла"  +1 +/
Сообщение от pavlinux (ok) on 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;

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

14. "Скопировать часть текста от определенной строки до конца файла"  –3 +/
Сообщение от greenwar (ok) on 14-Сен-15, 13:19 
нет чтобы человеку раз и навсегда объяснить, что через БД такое делается, если надо потом сложный поиск
нет, будем погружать дальше в тему костылей
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #15 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #16 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #17 | Наверх | Cообщить модератору

19. "Скопировать часть текста от определенной строки до конца файла"  –2 +/
Сообщение от greenwar (ok) on 08-Окт-15, 15:21 
>> нет чтобы человеку раз и навсегда объяснить, что через БД такое делается,
>> если надо потом сложный поиск
> Нукась, изобрази на SQL, выбор из таблицы с теми же условиями?

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

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

Ответить | Правка | ^ к родителю #15 | Наверх | Cообщить модератору

20. "Скопировать часть текста от определенной строки до конца файла"  +/
Сообщение от qazarus email on 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`

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2021 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру