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

使用AWK合并日志中以#开头的多行至单行的实现方案咨询

使用AWK合并日志中以#开头的多行至单行的实现方案咨询

没问题,这个需求用AWK就能轻松搞定,我给你写个简洁的脚本,专门处理这种场景:

/^#/ {
    if (buf != "") buf = buf " " $0
    else buf = $0
    next
}
{
    if (buf != "") {
        print buf
        buf = ""
    }
    print $0
}
END {
    if (buf != "") print buf
}

脚本逻辑解释:

  • 当遇到以#开头的行时,把该行内容追加到临时缓冲区buf里(第一次遇到时直接赋值,之后用空格拼接),然后跳过当前行的后续处理。
  • 当遇到非#开头的行时,先检查缓冲区里有没有内容,如果有就先打印缓冲区的合并结果,清空缓冲区,再打印当前行。
  • 最后在END块里处理文件末尾可能剩余的缓冲区内容,避免遗漏最后一批以#开头的行。

测试你的示例输入:

把你的日志内容保存到文件log.txt,然后执行命令:

awk -f merge.awk log.txt

输出结果就会和你想要的完全一致:

2023-11-15T08:59:28.000000+00:00 database-1 # Time: 231115  8:59:28 # User@Host: rdsadmin[rdsadmin] @ localhost [] # Thread_id: 3  Schema:   QC_hit: No # Query_time: 0.000123  Lock_time: 0.000000  Rows_sent: 1  Rows_examined: 0 # Rows_affected: 0  Bytes_sent: 49
SET timestamp=1700038768;
SET STATEMENT max_statement_time=60 FOR SELECT 1;

另外如果你想直接在命令行执行,不用单独保存脚本,也可以写成一行:

awk '/^#/{buf=buf?buf" "$0:$0;next} {if(buf){print buf;buf=""} print $0} END{if(buf)print buf}' log.txt

这个脚本兼容性很好,几乎所有版本的AWK都能运行,处理大日志文件也不会有性能问题~

备注:内容来源于stack exchange,提问作者dvthanh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 08:04:38