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

