使用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
相关产品推荐
相关产品推荐

