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

macOS原生bash实现日志缩进行合并到前一非缩进行的方法

正确实现方案

你之前的脚本问题主要出在三个点:

  • 每次循环都直接输出当前行,没有等同组的缩进行全部拼接完成再输出
  • 没有去除缩进行的前导空白字符
  • 行首特征判断逻辑不够严谨

方案1:纯Bash实现(兼容macOS自带的Bash 3.2版本)

#!/bin/bash
# 替换为你的日志文件路径,也可以通过传参的方式传入:log_file="$1"
log_file="target.log"

# 开启扩展通配符用于去除前导空白
shopt -s extglob
# 存储当前正在拼接的整行内容
current_line=""

# 逐行读取,|| 判断兼容最后一行没有换行符的情况
while IFS= read -r line || [[ -n "$line" ]]; do
    # 判断是否为非缩进的开头行(行首不为空白字符)
    if [[ "$line" == [![:space:]]* ]]; then
        # 已经有拼接中的行,先输出上一行的完整拼接结果
        [[ -n "$current_line" ]] && echo "$current_line"
        current_line="$line"
    else
        # 是缩进行,去除前导空白后拼接到当前行末尾
        trimmed_line="${line##+([[:space:]])}"
        current_line+="$trimmed_line"
    fi
done < "$log_file"

# 输出最后一组拼接完成的行
[[ -n "$current_line" ]] && echo "$current_line"

方案2:更简洁的Awk实现(macOS原生自带,执行效率更高)

awk '/^[^[:space:]]/ { if (prev!="") print prev; prev=$0; next } { sub(/^[[:space:]]+/,"",$0); prev=prev $0 } END { print prev }' target.log

两个方案执行后都会输出你需要的格式:

May 13 00:29:49 BBAOMACBOOKAIR2 com.apple.xpc.launchd[1] (com.apple.mdworker.bundles[12610]): Service exited with abnormal code: 78
May 13 00:30:00 BBAOMACBOOKAIR2 syslogd[113]: Configuration Notice:ASL Module "com.apple.cdscheduler" claims selected messages.Those messages may not appear in standard system log files or in the ASL database.
May 13 00:30:00 BBAOMACBOOKAIR2 syslogd[113]: Configuration Notice:ASL Module "com.apple.install" claims selected messages.Those messages may not appear in standard system log files or in the ASL database.

内容的提问来源于stack exchange,提问作者Kevin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:51:03