![搜索 Linux 文件并过滤掉特定字符串并删除其他所有内容](https://linux22.com/image/192107/%E6%90%9C%E7%B4%A2%20Linux%20%E6%96%87%E4%BB%B6%E5%B9%B6%E8%BF%87%E6%BB%A4%E6%8E%89%E7%89%B9%E5%AE%9A%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%B9%B6%E5%88%A0%E9%99%A4%E5%85%B6%E4%BB%96%E6%89%80%E6%9C%89%E5%86%85%E5%AE%B9.png)
我试图找到一种有效的方法来搜索目录中的整组文件,并且只查找第一个逗号之前的特定字符串。
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
更改为空字符串(""
)。