如果我需要在系统日志中搜索某些命令,则会发生这种情况:
$cat /var/log/postgresql/postgresql-9.1-main.log | grep 'UPDATE limit'
8833 2017-02-01 12:31:51 BRST [email protected] anotherdb LOG: comando: UPDATE limit
5067 2017-02-02 17:38:27 BRST [email protected] thisdb LOG: comando: UPDATE limit
但我需要完整的命令,我正在尝试很多命令,如 pcggrep、agrep、grep,但我没有任何成功。
预期结果需要如下所示(请注意查询的行数可能会有所不同):
8833 2017-02-01 12:31:51 BRST [email protected] anotherdb LOG: comando: UPDATE limit
SET xxx = xxx
FROM xxx
JOIN xxx ON xxx = xxx AND xxx = xxx
JOIN xxx ON xxx = xxx AND xxx = '012017'
WHERE xxx = xxx and xxx = 13
5067 2017-02-02 17:38:27 BRST [email protected] thisdb LOG: comando: UPDATE limit
SET xxx = xxx
FROM xxx
JOIN xxxx ON xxx = xxx AND xxx = xxx
我尝试了 pcggrep 和 agrep,但他们期望像开始模式或结束模式之类的东西,但我想我没有结束模式,这是葡萄牙语的默认 postgresql 配置,但是通过眼睛看,你可以看到当查询的新行从此数字 8833 或 5067 开始。
答案1
要使用pcregrep
请尝试以下操作:
pcregrep -iM "^[0-9]+.*UPDATE limit.*\n(^[^0-9].*\n){1,}" /var/log/postgresql/postgresql-9.1-main.log
-i 不区分大小写;
-M 表示多行;
您可以为需要搜索的其他类型的查询更改字符串“UPDATE limit”。
基本上,正则表达式是:查找以一位或多位数字开头的所有行,后跟一个字符串,然后是查询,后跟一个字符串直到行尾,然后后跟 1 行或多行 (){1,}不以数字 [^0-9] 开头。
这里有一个关联关于扩展正则表达式。