greping несколько строк из MySql binlog

У меня есть binlog от MySQL, и мне нужно вывести определенные временные рамки в отдельный файл, как мне это сделать?

Вот пример того, что содержит файл binlog:

# at 460
#130120  0:09:17 server id 1  end_log_pos 487   Xid = 79514636
COMMIT/*!*/;
# at 487
#130120  0:09:17 server id 1  end_log_pos 560   Query   thread_id=248447    exec_time=0 error_code=0

Я ищу grep следующее:

#130120  0:09:17 server id 1  end_log_pos 487   Xid = 79514636
COMMIT/*!*/;
# at 487

я пробовал pcregrep -M, но пока без какой-либо удачи, мои навыки регулярных выражений не там, где я думал, вот моя настоящая строка:

# mysqlbinlog /var/lib/mysql/log/logbin/mysql-bin.001036 | pcregrep -M '130120(\n|.*)\ at\ '
# 

* ОБНОВИТЬ *

  • количество строк между разными запросами.

* ОБНОВЛЕНИЕ 2 *

это на самом деле сделал работу...

# mysqlbinlog /var/lib/mysql/log/logbin/mysql-bin.001036 | sed -e '/130120 13/,/ at /!d' > /tmp/13
#

4 ответа

Решение

Реальный ответ заключается в использовании параметров командной строки для mysqlbinlog

mysqlbinlog --start-datetime=datetime --stop-datetime=datetime /path/to/mysql-bin.001036

Это можно было сделать с awk очень легко.

Например

mysqlbinlog mysql-bin.001 | awk '($1 == "130120") {print $0}' > results.txt

Это говорит awk найти что-либо в первом столбце, который соответствует 130120 точно, а затем распечатать всю эту строку.

Если вам нужны именно минута и секунда, вы можете сделать что-то вроде следующего:

awk '(($1 == "130120") && ($2 == "0:09:17")) {print $0}'

Если вам просто нужна минута, вы можете использовать что-то вроде этого:

awk '(($1 == "130120") && ($2 ~ "^0:09:")) {print $0}'

Это сделало работу:

# mysqlbinlog /var/lib/mysql/log/logbin/mysql-bin.001036 | sed -e '/130120 13/,/ at /!d' > /tmp/13
#
grep -C 1 COMMIT filename

-C - контекст, 1 строка до и 1 строка после

-А после

-Б раньше

Другие вопросы по тегам