在 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 模式中添加当前日期和时间与通配符匹配的主要内容,如果未能解决你的问题,请参考以下文章