从 grep 结果中提取子字符串

use*_*245 4 grep awk sed

给定一个日志文件,我通常会做这样的事情:

grep 'marker-1234' filter_log
Run Code Online (Sandbox Code Playgroud)

在模式中使用 '' 或 "" 或不使用有什么区别?

上面的 grep 命令将产生数千行;我想要什么。在这些行中,我通常需要一大块数据。有时,我使用 awk 打印出我想要的字段。在这种情况下,日志格式发生变化,我不能完全依赖位置,更何况实际记录的数据可以推动位置。

为了便于理解,假设日志行包含一个 IP 地址,这就是我所追求的全部内容,因此我可以稍后将其通过管道进行排序和唯一并获得一些计数。

一个例子可能是:

2010-04-08 some logged data, indetermineate chars - [marker-1234] (123.123.123.123) from: foo@bar.example.com to bar@foo.example.com [stat-xyz9876]
Run Code Online (Sandbox Code Playgroud)

第一个 grep 命令会给我像上面那样的数千行,从那里,我想把它输送到某个东西,可能是sed,它可以在里面拉出一个模式,然后只打印这个模式。

对于此示例,使用 IP 地址就足够了。我试过。是sed无法理解[0-9] {1,3}。作为一种模式?我不得不[0-9][0-9][0-9]。这产生了奇怪的结果,直到创建了整个模式。

这不是特定于 IP 地址,模式会改变,但我可以将其用作学习模板。

谢谢你们。

Chr*_*s S 6

我不知道您使用的是什么操作系统,但在 FreeBSD 7.0+ 上,grep 可以-o选择仅返回与模式匹配的部分。所以你可以
grep "marker-1234" filter_log | grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"

从“filter_log”中返回仅包含 IP 地址的列表...

这适用于我的系统,但同样,我不知道您的 grep 版本支持什么。