У меня есть 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
#
Это можно было сделать с 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
#
Настоящий ответ - использовать параметры командной строки для mysqlbinlog
mysqlbinlog --start-datetime=datetime --stop-datetime=datetime /path/to/mysql-bin.001036
grep -C 1 COMMIT filename
-C - это контекст, 1 строка до и 1 строка после
-A после
-B перед