使用单行sed命令移除控制字符、空行并合并每两行
单行GNU sed命令处理日志:移除控制字符、空行并合并行
需求
处理test.log文件,完成以下操作:
- 移除行尾的
^M(回车符)控制字符 - 删除所有空行
- 将每两行合并为一行
- 替换
-为0,移除数字后的MB后缀
原始日志内容 (test.log)
d62150:fxn3008_d62150 - ^M 809MB 668MB 271MB d62150:fxn4008_d62150 6227MB ^M 9465MB 9778MB 0MB
分步实现(管道组合)
之前通过多个sed命令管道完成了需求:
sed -r 's/\r//g;s/-/0/g;s/([0-9]+)MB/\1/g' test.log | sed '/^$/d' | sed "N;s/\n/ /"
输出结果
d62150:fxn3008_d62150 0 809 668 271 d62150:fxn4008_d62150 6227 9465 9778 0
整合为单行sed命令
利用GNU sed的标签循环和多命令支持,将所有逻辑合并为单个命令:
sed -r ':loop; /^\r?$/d; s/\r//g; s/-/0/g; s/([0-9]+)MB/\1/g; N; s/\n/ /; b loop' test.log
命令解析
:loop:定义循环标签,用于后续跳转循环/^\r?$/d:匹配空行或仅含回车符的行并直接删除s/\r//g:全局移除所有回车符(即^M控制字符)s/-/0/g:全局将-替换为0s/([0-9]+)MB/\1/g:捕获数字部分,移除后续的MB后缀N:读取下一行到当前模式空间,为两行合并做准备s/\n/ /:将两行之间的换行符替换为空格,完成合并b loop:跳转到loop标签,继续处理剩余行内容
环境说明
使用版本:sed (GNU sed) 4.2.2
内容的提问来源于stack exchange,提问作者micron cloud
相关产品推荐
相关产品推荐

