如何 grep 多行 postgresql 日志?

如何 grep 多行 postgresql 日志?

如果我需要在系统日志中搜索某些命令,则会发生这种情况:

$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] 开头。

这里有一个关联关于扩展正则表达式。

相关内容