You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两个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 Š.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 23:18:42