在 AWK 模式中添加当前日期和时间与通配符匹配

Posted

技术标签:

【中文标题】在 AWK 模式中添加当前日期和时间与通配符匹配【英文标题】:Adding Current Date and Time in AWK pattern match with Wildcard 【发布时间】:2021-06-19 13:37:59 【问题描述】:

我有这个要搜索的日志记录字符串:

[Nov 18, 2019 8:53:36 AM] ProcessFlow RMI Server started at: 10.155.166.24:16003

我想捕获月日、年和字符串“RMI Server started”

我在 AIX 命令行中没有运气:

$awk '$0 ~ /(date "+%b %d, %Y")*RMI Server started/' /lsf10/law/system/pfrmi.log

注意:它确实捕获 RMI 服务器已启动 - 但此消息的所有日期

【问题讨论】:

【参考方案1】:

第一个问题是date 调用,虽然从awk 脚本中调用是可行的,但如果我们在ksh 中进行调用,将结果存储在ksh 变量中会更容易,并且然后使用-v 选项将此变量传递给awk

第二个问题是混合使用 (awk) 变量和正则表达式进行模式匹配;我发现先构建一个正则表达式模式然后使用该模式进行实际的模式匹配会更容易一些。

但首先是一些数据……假设“今天”是 2021 年 3 月 23 日:

$ cat pfrmi.log
[Mar  9, 2019 8:53:36 AM] ProcessFlow RMI Server started at: 10.155.166.24:16003   - skip this line
[Mar 23, 2021 8:53:36 AM] ProcessFlow RMI Server started at: 10.155.166.24:16003   - pick this line
[Nov 18, 2019 8:53:36 AM] some other  TOT Server started at: 10.155.166.24:16003   - skip this line
[Mar 23, 2021 8:53:36 AM] ProcessFlow RMI Server started at: 10.155.166.24:16003   - pick this line
  [Mar 23, 2021 8:53:36 AM] ProcessFlow RMI Server started at: 10.155.166.24:16003 - skip this line
[Nov 18, 2020 8:53:36 AM] ProcessFlow RMI Server started at: 10.155.166.24:16003   - skip this line

现在建议的代码:

$ today=$(date '+%b %d, %Y')
$ echo "$today"
Mar 23, 2021

$ awk -v today="$today" '                            # pass ksh variable into awk
BEGIN     ptn="^[[]"today" .*RMI Server started"     # build our regex pattern
$0 ~ ptn                                               # test current line against our regex and if it matches the line will be passed to stdout
' pfrmi.log

对于我的示例数据文件,这会生成:

[Mar 23, 2021 8:53:36 AM] ProcessFlow RMI Server started at: 10.155.166.24:16003 - pick this line
[Mar 23, 2021 8:53:36 AM] ProcessFlow RMI Server started at: 10.155.166.24:16003 - pick this line

awk 折叠成单行命令并删除 cmets:

awk -v today="$today" 'BEGIN  ptn="^[[]"today" .*RMI Server started"  $0 ~ ptn' pfrmi.log

【讨论】:

以上是关于在 AWK 模式中添加当前日期和时间与通配符匹配的主要内容,如果未能解决你的问题,请参考以下文章

Linux正则表达式与通配符

使用模式匹配或通配符删除 Kubernetes POD

find、grep、sed、awk的使用

30分钟带你掌握正则表达式

我可以在 Libsoup 服务器中使用通配符模式匹配吗?

如何使用 awk 打印匹配的正则表达式模式?