如何合并两个awk match()函数,将结果打印在同一行?
合并两个awk match函数实现同一行输出IP与日期时间
你有两个独立的awk命令,分别用于匹配文本中的IP地址和2022开头的日期时间格式:
# 匹配IP地址 awk 'match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/){print substr($0,RSTART,RLENGTH)}'
# 匹配2022开头的日期时间(格式:2022:HH:MM:SS) awk 'match($0,/2022:[0-9]{2}:[0-9]{2}:[0-9]{2}/){print substr($0,RSTART,RLENGTH)}'
以下是几种合并方法,可让匹配到的IP和日期时间结果输出在同一行:
基础合并方案(兼容所有awk版本)
将两个匹配逻辑放在同一个awk脚本中,把匹配结果存入变量后统一打印:
awk ' { # 初始化变量为空 ip = "" dt = "" # 匹配IP地址并保存结果 if (match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/)) { ip = substr($0, RSTART, RLENGTH) } # 匹配日期时间并保存结果 if (match($0,/2022:[0-9]{2}:[0-9]{2}:[0-9]{2}/)) { dt = substr($0, RSTART, RLENGTH) } # 同一行输出两个结果(空格分隔) print ip, dt } '
简化写法(GNU awk 4.0+ 适用)
如果使用GNU awk(gawk)4.0及以上版本,可利用match函数的第三个参数直接捕获匹配结果,代码更简洁:
awk ' match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/, ip_arr) { ip = ip_arr[0] } match($0,/2022:[0-9]{2}:[0-9]{2}:[0-9]{2}/, dt_arr) { dt = dt_arr[0] } { print ip, dt } '
进阶:只输出同时匹配到IP和日期的行
如果需要过滤掉仅匹配到其中一项的行,可添加判断条件:
awk ' { ip = "" dt = "" if (match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/)) { ip = substr($0, RSTART, RLENGTH) } if (match($0,/2022:[0-9]{2}:[0-9]{2}:[0-9]{2}/)) { dt = substr($0, RSTART, RLENGTH) } # 仅当两者都匹配到时才输出 if (ip != "" && dt != "") { print ip, dt } } '
内容的提问来源于stack exchange,提问作者Daniel Š.
相关产品推荐
相关产品推荐

