想象一下以下问题:我有一个标准的 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
?