跨多行 Grep 但返回所有匹配项
Grep across multiple lines but returning all matches
我正在尝试对 cygwin 或 linux 下的 windows 文件进行 grep,以查找 table 锁和 table 之间的所有 MySQL 语句] 在 mysql 日志中解锁。
我可以使用 awk,但我需要原始文件中的行号
我不明白为什么 -Pzo 在 cygwin 中不工作
实际上我正在寻找一种方法来定位无法获得锁的语句(主查询被中断的地方)
如果我至少可以从 grep 获得合理的结果,那么我就可以搜索结果以找到某些东西中断了查询的条目。
2302221 Query LOCK TABLES browse WRITE, browse_being_allocated WRITE
2302221 Query SELECT id,startAtom,finishAtom FROM browse_being_allocated WHERE poolID = 31543 AND rushID = '32ca680dd0d84f9b9b2945e2186c09ff' AND format = 516 AND startAtom <= 1182716 AND finishAtom > 1182716
2302221 Query INSERT INTO browse (poolId,atom,skew,format,rushID,start,finish,databytes,srcPoolID,srcAtom,srcSkew,arrived) VALUES (31543,1182716,0,516,'32ca680dd0d84f9b9b2945e2186c09ff',274545,274588,315392,0,0,0,1)
2302221 Query UPDATE browse_being_allocated SET startAtom = 1182717 WHERE id = 26471948
2302221 Query UNLOCK TABLES
2522564 Query LOCK TABLES browse WRITE, browse_being_allocated WRITE
2522564 Query SELECT id,startAtom,finishAtom FROM browse_being_allocated WHERE poolID = 31543 AND rushID = '32ca680dd0d84f9b9b2945e2186c09ff' AND format = 516 AND startAtom <= 1182717 AND finishAtom > 1182717
2522564 Query INSERT INTO browse (poolId,atom,skew,format,rushID,start,finish,databytes,srcPoolID,srcAtom,srcSkew,arrived) VALUES (31543,1182717,0,516,'32ca680dd0d84f9b9b2945e2186c09ff',274588,274633,331776,0,0,0,1)
2522564 Query UPDATE browse_being_allocated SET startAtom = 1182718 WHERE id = 26471948
2522564 Query UNLOCK TABLES
上面的例子是合理的,下面的例子代表故障条件的第一部分。
2334151 Change user user@dbsrv1 on db
2334151 Query SET NAMES utf8
2334151 Query SET character_set_results = NULL
2334151 Query LOCK TABLES browse WRITE, browse_being_allocated WRITE
2302201 Change user user@dbsrv1 on db
2302201 Query SET NAMES utf8
2302201 Query SET character_set_results = NULL
2302201 Query SELECT DISTINCT rushID FROM tags WHERE rushID NOT IN (SELECT DISTINCT rushID FROM essencefragments) GROUP BY rushID
151216 19:00:39 2566722 Quit
我已经尝试了很多不同的方法来获得多行匹配,但我根本无法使任何工作正常进行。理想情况下,我会在 cygwin 下运行它,我真的需要保留原始行号,以便我可以跳回原始日志并将其绑定。
有什么想法吗?
干杯
awk 应该可以做你想做的事。我认为 perl 和 sed 可能也会如此。
我认为使用 -E(扩展正则表达式)会使您的正则表达式过于贪婪。
至于为什么你的 grep -P 不起作用,你必须使用 grep --version 和 grep--help 并做一些研究。我的在 Ubuntu 16.04.
上使用 GNU grep 2.22 运行良好
如果我正确理解了您的问题(我很可能没有正确理解),那么您需要 LOCK 和 UNLOCK 字符串之间的所有内容。这是一个可行的解决方案吗?
awk 'BEGIN {ln=1; lck="n"; print "---"};
lck=="y" {print ln")",[=10=]};
=="UNLOCK" {lck="n"; ln++; print "---"; next};
=="LOCK" && lck=="n" {print ln")",[=10=]; lck="y";ln++; next};
{ln++};
' NEWSJBHQDB12A.log > NEWSJBHQDB12A_filtered.txt;
它应该跟踪并显示行号 (var ln),以便您轻松参考原始日志文件。使用 "lck" 变量作为 on/off 开关,它将在找到 "LOCK" 时开始打印,并在找到 "UNLOCK."
时停止打印
$ cat file
2302221 Query LOCK TABLES browse WRITE, browse_being_allocated WRITE
2302221 Query SELECT id,startAtom,finishAtom FROM browse_being_allocated WHERE poolID = 31543 AND rushID = '32ca680dd0d84f9b9b2945e2186c09ff' AND format = 516 AND startAtom <= 1182716 AND finishAtom > 1182716
2302221 Query INSERT INTO browse (poolId,atom,skew,format,rushID,start,finish,databytes,srcPoolID,srcAtom,srcSkew,arrived) VALUES (31543,1182716,0,516,'32ca680dd0d84f9b9b2945e2186c09ff',274545,274588,315392,0,0,0,1)
2302221 Query UPDATE browse_being_allocated SET startAtom = 1182717 WHERE id = 26471948
2302221 Query UNLOCK TABLES
2334151 Change user user@dbsrv1 on db
2334151 Query SET NAMES utf8
2334151 Query SET character_set_results = NULL
2334151 Query LOCK TABLES browse WRITE, browse_being_allocated WRITE
2302201 Change user user@dbsrv1 on db
2302201 Query SET NAMES utf8
2302201 Query SET character_set_results = NULL
2302201 Query SELECT DISTINCT rushID FROM tags WHERE rushID NOT IN (SELECT DISTINCT rushID FROM essencefragments) GROUP BY rushID 151216 19:00:39
2566722 Quit
2522564 Query LOCK TABLES browse WRITE, browse_being_allocated WRITE
2522564 Query SELECT id,startAtom,finishAtom FROM browse_being_allocated WHERE poolID = 31543 AND rushID = '32ca680dd0d84f9b9b2945e2186c09ff' AND format = 516 AND startAtom <= 1182717 AND finishAtom > 1182717
2522564 Query INSERT INTO browse (poolId,atom,skew,format,rushID,start,finish,databytes,srcPoolID,srcAtom,srcSkew,arrived) VALUES (31543,1182717,0,516,'32ca680dd0d84f9b9b2945e2186c09ff',274588,274633,331776,0,0,0,1)
2522564 Query UPDATE browse_being_allocated SET startAtom = 1182718 WHERE id = 26471948
2522564 Query UNLOCK TABLES
测试:
$ awk 'BEGIN {ln=1; lck="n"; print "---"};
lck=="y" {print ln")",[=12=]};
=="UNLOCK" {lck="n"; ln++; print "---"; next};
=="LOCK" && lck=="n" {print ln")",[=12=]; lck="y";ln++; next};
{ln++};
' file
---
1) 2302221 Query LOCK TABLES browse WRITE, browse_being_allocated WRITE
2) 2302221 Query SELECT id,startAtom,finishAtom FROM browse_being_allocated WHERE poolID = 31543 AND rushID = '32ca680dd0d84f9b9b2945e2186c09ff' AND format = 516 AND startAtom <= 1182716 AND finishAtom > 1182716
3) 2302221 Query INSERT INTO browse (poolId,atom,skew,format,rushID,start,finish,databytes,srcPoolID,srcAtom,srcSkew,arrived) VALUES (31543,1182716,0,516,'32ca680dd0d84f9b9b2945e2186c09ff',274545,274588,315392,0,0,0,1)
4) 2302221 Query UPDATE browse_being_allocated SET startAtom = 1182717 WHERE id = 26471948
5) 2302221 Query UNLOCK TABLES
---
9) 2334151 Query LOCK TABLES browse WRITE, browse_being_allocated WRITE
10) 2302201 Change user user@dbsrv1 on db
11) 2302201 Query SET NAMES utf8
12) 2302201 Query SET character_set_results = NULL
13) 2302201 Query SELECT DISTINCT rushID FROM tags WHERE rushID NOT IN (SELECT DISTINCT rushID FROM essencefragments) GROUP BY rushID 151216 19:00:39
14) 2566722 Quit
15) 2522564 Query LOCK TABLES browse WRITE, browse_being_allocated WRITE
16) 2522564 Query SELECT id,startAtom,finishAtom FROM browse_being_allocated WHERE poolID = 31543 AND rushID = '32ca680dd0d84f9b9b2945e2186c09ff' AND format = 516 AND startAtom <= 1182717 AND finishAtom > 1182717
17) 2522564 Query INSERT INTO browse (poolId,atom,skew,format,rushID,start,finish,databytes,srcPoolID,srcAtom,srcSkew,arrived) VALUES (31543,1182717,0,516,'32ca680dd0d84f9b9b2945e2186c09ff',274588,274633,331776,0,0,0,1)
18) 2522564 Query UPDATE browse_being_allocated SET startAtom = 1182718 WHERE id = 26471948
19) 2522564 Query UNLOCK TABLES
---
简单示例:
$ cat file
NO PRINT
NO PRINT
1 Query LOCK
STUFF
STUFF
STUFF
1 Query UNLOCK
NO PRINT
2 Query LOCK
STUFF
2 Query UNLOCK
NO PRINT
NO PRINT
NO PRINT
NO PRINT
$ awk 'BEGIN {ln=1; lck="n"; print "---"};
lck=="y" {print ln")",[=13=]};
=="UNLOCK" {lck="n"; ln++; print "---"; next};
=="LOCK" && lck=="n" {print ln")",[=13=]; lck="y";ln++; next};
{ln++};
' file
---
3) 1 Query LOCK
4) STUFF
5) STUFF
6) STUFF
7) 1 Query UNLOCK
---
9) 2 Query LOCK
10) STUFF
11) 2 Query UNLOCK
---
我正在尝试对 cygwin 或 linux 下的 windows 文件进行 grep,以查找 table 锁和 table 之间的所有 MySQL 语句] 在 mysql 日志中解锁。
我可以使用 awk,但我需要原始文件中的行号
我不明白为什么 -Pzo 在 cygwin 中不工作
实际上我正在寻找一种方法来定位无法获得锁的语句(主查询被中断的地方)
如果我至少可以从 grep 获得合理的结果,那么我就可以搜索结果以找到某些东西中断了查询的条目。
2302221 Query LOCK TABLES browse WRITE, browse_being_allocated WRITE
2302221 Query SELECT id,startAtom,finishAtom FROM browse_being_allocated WHERE poolID = 31543 AND rushID = '32ca680dd0d84f9b9b2945e2186c09ff' AND format = 516 AND startAtom <= 1182716 AND finishAtom > 1182716
2302221 Query INSERT INTO browse (poolId,atom,skew,format,rushID,start,finish,databytes,srcPoolID,srcAtom,srcSkew,arrived) VALUES (31543,1182716,0,516,'32ca680dd0d84f9b9b2945e2186c09ff',274545,274588,315392,0,0,0,1)
2302221 Query UPDATE browse_being_allocated SET startAtom = 1182717 WHERE id = 26471948
2302221 Query UNLOCK TABLES
2522564 Query LOCK TABLES browse WRITE, browse_being_allocated WRITE
2522564 Query SELECT id,startAtom,finishAtom FROM browse_being_allocated WHERE poolID = 31543 AND rushID = '32ca680dd0d84f9b9b2945e2186c09ff' AND format = 516 AND startAtom <= 1182717 AND finishAtom > 1182717
2522564 Query INSERT INTO browse (poolId,atom,skew,format,rushID,start,finish,databytes,srcPoolID,srcAtom,srcSkew,arrived) VALUES (31543,1182717,0,516,'32ca680dd0d84f9b9b2945e2186c09ff',274588,274633,331776,0,0,0,1)
2522564 Query UPDATE browse_being_allocated SET startAtom = 1182718 WHERE id = 26471948
2522564 Query UNLOCK TABLES
上面的例子是合理的,下面的例子代表故障条件的第一部分。
2334151 Change user user@dbsrv1 on db
2334151 Query SET NAMES utf8
2334151 Query SET character_set_results = NULL
2334151 Query LOCK TABLES browse WRITE, browse_being_allocated WRITE
2302201 Change user user@dbsrv1 on db
2302201 Query SET NAMES utf8
2302201 Query SET character_set_results = NULL
2302201 Query SELECT DISTINCT rushID FROM tags WHERE rushID NOT IN (SELECT DISTINCT rushID FROM essencefragments) GROUP BY rushID
151216 19:00:39 2566722 Quit
我已经尝试了很多不同的方法来获得多行匹配,但我根本无法使任何工作正常进行。理想情况下,我会在 cygwin 下运行它,我真的需要保留原始行号,以便我可以跳回原始日志并将其绑定。
有什么想法吗? 干杯
awk 应该可以做你想做的事。我认为 perl 和 sed 可能也会如此。
我认为使用 -E(扩展正则表达式)会使您的正则表达式过于贪婪。 至于为什么你的 grep -P 不起作用,你必须使用 grep --version 和 grep--help 并做一些研究。我的在 Ubuntu 16.04.
上使用 GNU grep 2.22 运行良好如果我正确理解了您的问题(我很可能没有正确理解),那么您需要 LOCK 和 UNLOCK 字符串之间的所有内容。这是一个可行的解决方案吗?
awk 'BEGIN {ln=1; lck="n"; print "---"};
lck=="y" {print ln")",[=10=]};
=="UNLOCK" {lck="n"; ln++; print "---"; next};
=="LOCK" && lck=="n" {print ln")",[=10=]; lck="y";ln++; next};
{ln++};
' NEWSJBHQDB12A.log > NEWSJBHQDB12A_filtered.txt;
它应该跟踪并显示行号 (var ln),以便您轻松参考原始日志文件。使用 "lck" 变量作为 on/off 开关,它将在找到 "LOCK" 时开始打印,并在找到 "UNLOCK."
时停止打印$ cat file
2302221 Query LOCK TABLES browse WRITE, browse_being_allocated WRITE
2302221 Query SELECT id,startAtom,finishAtom FROM browse_being_allocated WHERE poolID = 31543 AND rushID = '32ca680dd0d84f9b9b2945e2186c09ff' AND format = 516 AND startAtom <= 1182716 AND finishAtom > 1182716
2302221 Query INSERT INTO browse (poolId,atom,skew,format,rushID,start,finish,databytes,srcPoolID,srcAtom,srcSkew,arrived) VALUES (31543,1182716,0,516,'32ca680dd0d84f9b9b2945e2186c09ff',274545,274588,315392,0,0,0,1)
2302221 Query UPDATE browse_being_allocated SET startAtom = 1182717 WHERE id = 26471948
2302221 Query UNLOCK TABLES
2334151 Change user user@dbsrv1 on db
2334151 Query SET NAMES utf8
2334151 Query SET character_set_results = NULL
2334151 Query LOCK TABLES browse WRITE, browse_being_allocated WRITE
2302201 Change user user@dbsrv1 on db
2302201 Query SET NAMES utf8
2302201 Query SET character_set_results = NULL
2302201 Query SELECT DISTINCT rushID FROM tags WHERE rushID NOT IN (SELECT DISTINCT rushID FROM essencefragments) GROUP BY rushID 151216 19:00:39
2566722 Quit
2522564 Query LOCK TABLES browse WRITE, browse_being_allocated WRITE
2522564 Query SELECT id,startAtom,finishAtom FROM browse_being_allocated WHERE poolID = 31543 AND rushID = '32ca680dd0d84f9b9b2945e2186c09ff' AND format = 516 AND startAtom <= 1182717 AND finishAtom > 1182717
2522564 Query INSERT INTO browse (poolId,atom,skew,format,rushID,start,finish,databytes,srcPoolID,srcAtom,srcSkew,arrived) VALUES (31543,1182717,0,516,'32ca680dd0d84f9b9b2945e2186c09ff',274588,274633,331776,0,0,0,1)
2522564 Query UPDATE browse_being_allocated SET startAtom = 1182718 WHERE id = 26471948
2522564 Query UNLOCK TABLES
测试:
$ awk 'BEGIN {ln=1; lck="n"; print "---"};
lck=="y" {print ln")",[=12=]};
=="UNLOCK" {lck="n"; ln++; print "---"; next};
=="LOCK" && lck=="n" {print ln")",[=12=]; lck="y";ln++; next};
{ln++};
' file
---
1) 2302221 Query LOCK TABLES browse WRITE, browse_being_allocated WRITE
2) 2302221 Query SELECT id,startAtom,finishAtom FROM browse_being_allocated WHERE poolID = 31543 AND rushID = '32ca680dd0d84f9b9b2945e2186c09ff' AND format = 516 AND startAtom <= 1182716 AND finishAtom > 1182716
3) 2302221 Query INSERT INTO browse (poolId,atom,skew,format,rushID,start,finish,databytes,srcPoolID,srcAtom,srcSkew,arrived) VALUES (31543,1182716,0,516,'32ca680dd0d84f9b9b2945e2186c09ff',274545,274588,315392,0,0,0,1)
4) 2302221 Query UPDATE browse_being_allocated SET startAtom = 1182717 WHERE id = 26471948
5) 2302221 Query UNLOCK TABLES
---
9) 2334151 Query LOCK TABLES browse WRITE, browse_being_allocated WRITE
10) 2302201 Change user user@dbsrv1 on db
11) 2302201 Query SET NAMES utf8
12) 2302201 Query SET character_set_results = NULL
13) 2302201 Query SELECT DISTINCT rushID FROM tags WHERE rushID NOT IN (SELECT DISTINCT rushID FROM essencefragments) GROUP BY rushID 151216 19:00:39
14) 2566722 Quit
15) 2522564 Query LOCK TABLES browse WRITE, browse_being_allocated WRITE
16) 2522564 Query SELECT id,startAtom,finishAtom FROM browse_being_allocated WHERE poolID = 31543 AND rushID = '32ca680dd0d84f9b9b2945e2186c09ff' AND format = 516 AND startAtom <= 1182717 AND finishAtom > 1182717
17) 2522564 Query INSERT INTO browse (poolId,atom,skew,format,rushID,start,finish,databytes,srcPoolID,srcAtom,srcSkew,arrived) VALUES (31543,1182717,0,516,'32ca680dd0d84f9b9b2945e2186c09ff',274588,274633,331776,0,0,0,1)
18) 2522564 Query UPDATE browse_being_allocated SET startAtom = 1182718 WHERE id = 26471948
19) 2522564 Query UNLOCK TABLES
---
简单示例:
$ cat file
NO PRINT
NO PRINT
1 Query LOCK
STUFF
STUFF
STUFF
1 Query UNLOCK
NO PRINT
2 Query LOCK
STUFF
2 Query UNLOCK
NO PRINT
NO PRINT
NO PRINT
NO PRINT
$ awk 'BEGIN {ln=1; lck="n"; print "---"};
lck=="y" {print ln")",[=13=]};
=="UNLOCK" {lck="n"; ln++; print "---"; next};
=="LOCK" && lck=="n" {print ln")",[=13=]; lck="y";ln++; next};
{ln++};
' file
---
3) 1 Query LOCK
4) STUFF
5) STUFF
6) STUFF
7) 1 Query UNLOCK
---
9) 2 Query LOCK
10) STUFF
11) 2 Query UNLOCK
---