搜索 Linux 文件并过滤掉特定字符串并删除其他所有内容

搜索 Linux 文件并过滤掉特定字符串并删除其他所有内容

我试图找到一种有效的方法来搜索目录中的整组文件,并且只查找第一个逗号之前的特定字符串。

postgres 日志文件示例:

Apr 27 03:35:18 test postgres[24098]: [5-1] user=postgres,db=postgres,app=psqlclient=127.0.0.1
Apr 27 03:35:18 test postgres[24098]: [5-2] user=postgres,db=postgres,app=psqlclient=127.0.0.1 

我只对文件中使用的用户名感兴趣。我可以使用 pgbadger 并通过 HTML 查看它,但这会非常耗时。

举个例子,我只能看到:

user=postgres

与用户之前和之后的整套文本相反。

不过我正在寻找任何不是专门为 postgres 的用户。

我尝试过在文件上使用 grep,但我只看到 user=postgres 的结果。

无论如何,是否可以在一组文件中搜索 user= 直到第一个逗号作为示例?

或者甚至搜索每个文件并删除每行中 user= 之前的任何内容,然后我可以将其放入 Excel 中以获得我需要的结果。

任何帮助深表感谢。

答案1

GNU grep与以下一起使用PCRE

grep -Po -- '(?<=user=).+?(?=,)' *.log

如果您也想显示user=关键字:

grep -o -- 'user=[^,]*' *.log

-H 您甚至可以通过在上面的命令中添加该选项来显示匹配成功的文件grep(如果没有该选项,则仅在指定多个文件时才显示文件名)。

所以grep命令变成:

grep -Ho -- 'user=[^,]*' *.log

和输出:

pgsql.log:user=postgres
pgsql.log:user=postgres

答案2

使用awk

awk '/user=/{gsub(/^.*user=|,.*$/, "");print $0}' file

如果要显示user=文件名,则可以更改命令。

awk '/user=/{gsub(/^.*user=|,.*$/, "");
printf "%s:user=%s\n",FILENAME,$0}' *.log

在此命令中,如果user=找到,则 gsub()函数将从记录开头到记录末尾的字符user=和后面的逗号user更改为空字符串("")。

相关内容