我找到了许多类似问题的答案,但没有一个能解决我的问题。
我尝试解释一下: 我有由mysql一般日志生成的日志文件,我想在其中过滤在特定表上触发的查询。 我正在尝试通过grep和regex来做到这一点。
每个条目均以双标签开头。因此,我启用了 multiline 和 dotall ,并尝试通过正向后向和正向(?<=\t\t).*?(?=\t\t|\Z)
来获取条目。
到目前为止,这仍然有效,对于跨多行的查询也是如此。
我无法执行的操作是仅筛选出某个表的条目(表名称:s_order)。
(?<=\t\t).*?s_order.*?(?=\t\t|\Z)
不起作用。看起来很合理,因为中间的匹配模式在表名之前包括任何字符,在表名称之后包括任何字符。但是我无法提出一个可行的解决方案。
示例:
每个8位数字的前面都有一个双标签,因此下面粘贴的部分的格式不正确。关键字Query, Quit, Connext, ...
后面还有一个标签
例如(tab)(tab)36003847 Query(tab)SELECT count(userid) AS number FROM sys_user WHERE typ = 'admin'
我想要的结果是第4行和第8至15行。
36003847 Query SELECT count(userid) AS number FROM sys_user WHERE typ = 'admin'
36003847 Quit
36003844 Query SELECT * FROM server_php WHERE server_id = 1 AND name = 'PHP 5.4.23' AND php_fpm_init_script = '/etc/init.d/php-5.4.23-fpm'
36003844 Query UPDATE s_order SET php_version = '5.4.23' WHERE server_php_id = '3'
36003848 Connect c1Live@localhost as anonymous on c1LIVE
36003848 Query SET NAMES 'utf8'
36003848 Query SET @@session.sql_mode = ''
36003848 Query SELECT
name, id, name, label,
description, source, active,
installation_date as installationDate,
update_date as updateDate, changes,
version
FROM s_order
WHERE namespace='Core'
36003848 Query SELECT
ce.subscribe as name,
ce.listener,
ce.position,
cp.name as plugin
FROM s_core_subscribes ce
JOIN s_core_plugins cp
ON cp.id=ce.pluginID
AND cp.active=1
AND cp.namespace='Core'
WHERE ce.type=0
ORDER BY name, position