LINUX.ORG.RU

Вырезать диапазон дат из логов на bash

 ,


2

2

Добрый день, подскажите пожалуйста, пишу скрипт:

#!/bin/bash
read -p "В каком логе искать " log
read -p "Дата 1" date1
read -p "Дата 2" date2 
START=`grep -n 'data1' "$log" | cut -f1 -d:`
echo $START
END=`grep -n 'data2' "$log" | cut -f1 -d:`
echo $END
RESULT='sed -n '/$START/,/$END/p' "$log"' > "$log".temp 
echo $RESULT
скрипт должен вырезать логи с определенной датой и перемещать результат в файл.темп. Пример:
START='grep -n "12:46:03" "planner.log" |cut -f1 -d:'
echo 
1 
2
3
4
END='grep -n '12:46:04' "planner.log" | cut -f1 -d:`
echo
5
6
7
8
Но sed почему-то не обрабатывает строки

Что можно сказать? Держи нас в курсе!

vvn_black ★★★★★ ()

Парсинг логов не настолько новая и уникальная задача, что тут стоит городить свой велосипед.

Deleted ()
Ответ на: комментарий от entefeed

Не успел дописать тему) Мне нужно именно в определенном файле

airnya ()
Ответ на: комментарий от Deleted

Я хотел написать простенький скрипт но не понимаю в чем здесь ошибка

airnya ()

Даже подтереть за собой не можешь ...

anonymous ()

А нагадить то осилил ?

anonymous ()

RESULT='sed -n '/$START/,/$END/p' «$log»' > «$log».temp

здесь ошибка, наверное имелось ввиду так:

sed -n '/'$START'/,/'$END'/p' "$log" > "$log".temp
cat "$log".temp

nerve ★★ ()
Последнее исправление: nerve (всего исправлений: 1)
grep -E '12:46:0[3-4]' *.log

Дальше, думаю, сам сообразишь.

pon4ik ★★★★★ ()

Для работы с датами в произвольном формате есть утилита date, которая, внезапно, не только умеет показывать текущее время, но и конвертировать время из одного формата в другой. Читаешь лог построчно посредством while read line ; do ... done, конвертируешь время из каждой строки лога в Unix timestamp посредством date -d «${date_from_string}» +%s, и полученный timestamp сравниваешь с нужными тебе границами.

Stanson ★★★★★ ()

если костылить:

dt='2001/02/03 12:46:04' 

echo "$dt test" | gawk -v dt="$dt" \
'
function epoch(str) {
	gsub("[/:]", " ", str)
	return mktime(str)
}

BEGIN { dt = epoch(dt) }

epoch($1" "$2) == dt
'

(mktime не посикс => gawk) или на руби

anonymous ()
Ответ на: комментарий от airnya

Но sed почему-то не обрабатывает строки
RESULT='sed

У тебя в RESULT присваивание значения, а не подстановка команд. Так как начинается с одинарной кавычки, а не с обратной кавычки. Дабы не заморачиваться с кавычками подстановку лучше обернуть так - $(команда)

Samsky ()
Ответ на: комментарий от Stanson

Если лог весит 5гб, только сама конвертация не займет довольно продолжительное время?

airnya ()
Ответ на: комментарий от airnya

Если лог весит 5гб,

То админу надо надавать некислых звездюлей. Желательно в лицо.

Stanson ★★★★★ ()
Ответ на: комментарий от Stanson

У нас можно поднять уровень логирования на определенный промежуток времени для отслеживания ошибки тд тп, поэтому лог становится таким объемным. Как раз хотел использовать конвертацию, т.к. в некоторых логах дата имеет другой формат, осталось подумать как реализовать)

airnya ()
Ответ на: комментарий от airnya

Ну парсить 5Гб в любом случае быстро не получится. Можно посредством dd например разбить его на пару десятков кусков, найти среди них с нужным временем и ковырять уже его.

Но вообще, ротация логов, в том числе по размеру - вещь очень полезная и правильная.

Stanson ★★★★★ ()
Ответ на: комментарий от Stanson

Попробую пока реализовать первую идею с date которую ты предложил, спасибо)

airnya ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.