对流中的行进行操作并保留上下文

对流中的行进行操作并保留上下文

想象一下以下问题:我有一个标准的 Apache 日志。我想过滤掉带有某个关键字的请求URL。很简单,我们使用,

$ grep "keyword" somedomain-access.log

这工作得很好,但不够稳健,即它不能在 100% 的情况下按要求工作。想象一下我们的关键字是“GET”,(取决于网站)几乎所有行都会被 grep 命令匹配。

我们通过以下方式进行一些预处理:

$ cut -d" " -f['i'th field containing the url] somedomain-access.log | 
    grep "keyword"

这工作得更好一些,但现在我丢失了所有上下文信息,即我随命令丢弃的其他字段cut

现在这个问题越来越困扰着我。当然,在这种特定情况下您可以使用 awk,但通常在一般情况下命令awk是不够的。

在非 shell 语言中,您只需检查对象的成员并执行操作。再次使用我们的 Apache 日志示例,在 Scala 中使用,

> // Preprocessed list of apache log into `records`
> val records = List(AccessLogRecord(...), AccessLogRecord(...), ...)
> val recordsWithKeyword = records.filter(_ => _.request == "keyword")

结果仍然是一个列表,其中每个项目(在本例中为 AccessLogRecord)仍然具有所有上下文信息,如日期、HTTP 代码等。

我们如何使用管道、重定向等在命令行上实现相同的目的;不依赖于特定的应用程序,例如awk

相关内容