sed命令应用场景

2020-08-19  本文已影响0人  欧阳_z

1、sed删除字符串

(1)描述
做嵌入式开发,有时候需要分析开机 log,比如一份正常情况下的 log 与一份异常的 log 做对比,如果放到 Beyond Compare 中对比,会看到一大片都是红色的差异,因为 kernel 通常在每行 log 前面加了时间作为前缀,比如[ 5.301219],所以需要删除这些时间,才能让 log 看起来比较干净,这里可以用 sed 命令来处理.

(2)分析
在 kernel 源代码的 print_time 函数中:
https://elixir.bootlin.com/linux/v5.0/source/kernel/printk/printk.c
可以看到时间的输出格式为 [%5lu.%06lu]%lulong unsigned int 可能是 48 字节,不同平台不同实现,最多 8 字节,也就是说十进制状态下最长 20 位,长度不足的情况下,%5lu补空格,%06lu0

正则表达式中,元字符 \s 匹配任何空白字符,
*匹配前面的子表达式零次或多次。
中括号[]可以匹配范围字符,
大括号{n,m}可以匹配次数,最少匹配 n 次且最多匹配 m 次。
. 可匹配任意字符,所以这里需要用 \ 转义,
^ 匹配字符串的开始位置,这样不会影响到中间的部分,
综上,sed 命令可以这样写:

$ cat putty.log
[    5.301219] 123
[    5.001219] 456
[12345.001219] abc
[12345.301219] de
abc[12345678.12345678] fgh
[12345678.12345678] ijk
$ 
$ sed -i 's/^\[\s*[0-9]\{1,20\}\.[0-9]\{1,20\}\]\s//' putty.log
$ cat putty.log
123
456
abc
de
abc[12345678.12345678] fgh
ijk
$ 
上一篇 下一篇

猜你喜欢

热点阅读