如何用Bash脚本移除文本文件换行符(syslog开头行除外)
修复损坏的Syslog日志文件(Bash实现)
要实现「移除随机插入的换行,仅保留以syslog头(<数字>)开头的行的换行」需求,用awk或sed都可以快速完成,以下是两种实用方案:
方案一:用awk实现(逻辑直观易维护)
awk是处理文本场景的首选工具,逻辑清晰且容易调整:
awk ' # 匹配syslog头开头的行 /^<[0-9]+>/ { if (line != "") print line # 输出之前积累的内容 line = $0 # 开始新的一行 next } # 非syslog头开头的行,追加到上一行 { line = line " " $0 } # 脚本结束时输出最后一行内容 END { if (line != "") print line } ' 损坏的日志文件名.txt > 修复后的日志文件名.txt
逻辑说明
- 当检测到以
<数字>开头的行时,先输出之前拼接好的内容(如果有的话),然后将当前行作为新的起始行。 - 非syslog头开头的行,直接追加到当前积累的行末尾(加空格分隔)。
- 脚本结束前输出最后一行,避免丢失未处理的内容。
方案二:用sed实现(单行命令)
如果喜欢更简洁的单行命令,sed也能完成:
sed -e ':loop' -e '/^<[0-9]\+>/{$!N;s/\n\([^<]\)/ \1/;b loop}' 损坏的日志文件名.txt > 修复后的日志文件名.txt
逻辑说明
- 定义标签
loop,用于循环处理多行。 - 读取下一行内容(
$!N,最后一行除外),如果下一行不是以<开头(即不是syslog头),就把换行符替换成空格。 - 重复执行循环,直到下一行是syslog头为止。
示例验证
原损坏日志:
<192> SeSystemtimePrivilege SeBackupPrivilege
SeRestorePrivilege
SeShutdownPrivilege
SeSystemEnvironmentPrivilege
SeUndockPrivilege
<198> SeShutdownPrivilege SeSystemEnvironmentPrivilege SeUndockPrivilege
修复后输出:
<192> SeSystemtimePrivilege SeBackupPrivilege SeRestorePrivilege SeShutdownPrivilege SeSystemEnvironmentPrivilege SeUndockPrivilege
<198> SeShutdownPrivilege SeSystemEnvironmentPrivilege SeUndockPrivilege
内容的提问来源于stack exchange,提问作者Mathis Legrand
相关产品推荐
相关产品推荐

