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]
,%lu
是long unsigned int
可能是 4
或 8
字节,不同平台不同实现,最多 8
字节,也就是说十进制状态下最长 20
位,长度不足的情况下,%5lu
补空格,%06lu
补0
。
正则表达式中,元字符 \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
$
网友评论