Как извлечь все идентификаторы, доступные из общего журнала mysql, используя командную строку linux? - PullRequest
1 голос
/ 10 января 2011

Это должен быть тривиальный вопрос для тех, кто хорош в bash / sed / awk.К сожалению, пока нет:)

У меня есть общий журнал от MySQL, который содержит несколько запросов, имеющих общий параметр, они запрашивают определенное поле идентификатора.Запросы выглядят как

update tbl set col='binary_values' where id=X;

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

В конце концов мы решили проблему временно, используя скрипт на python, но я уверен, что набор инструментов командной строки linux может сделать это тоже.Как бы вы это сделали?

Обновление (пример запроса в журнале):

5999 Query     update tbl set col='<AC><ED>\0^Ez\0\0^AaESC\0\0\0^D}k<85><F4>\0\0
c\0\0\0\0\0\0\0\0\0\0\0\0\0^A\0\0\0^A\0^A\0\0\0^A\0^A\0\0\0^A\0\0\0\0\0\0\0\0\0\0\0^A\0\0\0^Z^E^A<F6><DE>^A\0^A<F7><DE>^A\0^A<F8><DE>^A\0^A<F9><DE>^A\0^A<FE><DE>^A\0\0\0\0\0^A\0\0\0Q^E^C<C4>^O^A\0?<80>\0\0\0�°<C2><EA><D2>%^C<CB>^O^A\0?<80>\0\0\0�«<9C><CD><CC>%^C<EA>^Y^A\0?<80>\0\0\0�°<C2><EA><D2>%^C<90>^L^A\0?<80>\0\0\0�°<C2><EA><D2>%^C<F6>^L^A\0?<80>\0\0\0�«<9C><CD><CC>%\0^A\0\0\0T^E^D^A\0^A<83><D2>|^A<C4>^O\0�<D3>�³%^D^B\0^A�<B5>^B^A<F5>^K^A^R�<B2>�³%^D^A\0^A<FA>^L\0\0<AE><96><B1>�³%^D^A\0^A<F7>^W^A<90>^L^AESC<96><FC><B1>�³%^D^A\0^A^T^A<EA>^Y^A^F<F5>�±�³%\0\0\0\0\0\0\0^A\0\0\0^U^A^B\0\0\0\0\0\0^O9\0\0^A+<<87>u<E0>^A<85>^B^A\0\0\0^_^B^A^F^A\0?<80>\0\0\0�°<C2><EA><D2>%^AESC^A\0?<80>\0\0\0�°<C2><EA><D2>%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0' where id=19284067828

Бинарный мусор содержит разрывы строк, а также символы "=" и усложняет его выполнение.используйте «вырезать».

Ответы [ 3 ]

1 голос
/ 11 января 2011

На основе вашего примера записи в журнале это может работать:

sed -n 's/.*update tbl set col=.*where id=\([0-9]\+\)$/\1/p' file.log

Чтобы подсчитать вхождение каждого идентификатора, вы можете направить вывод в sort и uniq

sed -n 's/.*update tbl set col=.*where id=\([0-9]\+\)$/\1/p' file.log | sort | uniq -c
1 голос
/ 10 января 2011

Будет полезно, если вы скопируете вставленную пару, если эти запросы, особенно в отношении бинарного мусора, о котором вы говорите.но например

grep "update tbl set col" yourfile.log | cut -d '=' -f 3  | sort | uniq -c
0 голосов
/ 10 января 2011

Я хотел бы создать столбец отметки времени mod_date, по умолчанию 0, при обновлении установить значение current_timestamp (см. this )

Чтобы получить список обновленных записей, вы можете легко найти, отфильтровав по mod_date

mod_date!=0  --> bindly get count

mod_date!=0 and mod_date>='since last log date'
...