如何处理电话日志:保留首组括号内容,删除第二组括号及内容
保留时间戳并删除通话ID的sed解决方案
先看看你处理后的日志示例:
[2019-07-18 14:12:57] [1563477176.20446] '30' <redacted> at 162+ [2019-07-18 14:14:08] [1563477248.20463] '30' <redacted> at 162+ [2019-07-18 14:19:20] [1563477559.20468] '30' <redacted> at 162+ [2019-07-18 23:30:41] [1563510638.21273] '30' <redacted> at 162+ [2019-07-18 23:31:21] [1563510678.21276] '30' <redacted> at 162+
你想要保留第一组括号里的时间戳,删掉第二组括号的通话ID,之前的命令会删掉所有括号内容确实不行。其实不用拆分每行处理,用sed的分组捕获就能精准实现需求,给你两个靠谱的方案:
方案一:利用时间戳括号固定长度(精准匹配)
既然第一组时间戳的括号长度是固定的,我们可以直接捕获这部分内容,只替换后面的第二组括号:
sed -E 's/^(\[[^]]+\]) \[[^]]+\]/\1/'
命令解释:
^(\[[^]]+\]):匹配行首的第一组括号内容,用括号把它标记为捕获组\1\[[^]]+\]:匹配第一组括号后面的空格,加上第二组括号及其内部的所有内容- 替换成
\1,也就是只保留我们需要的时间戳,删掉第二组括号部分
处理后的结果就是你要的样子:
[2019-07-18 14:12:57] '30' <redacted> at 162+ [2019-07-18 14:14:08] '30' <redacted> at 162+ [2019-07-18 14:19:20] '30' <redacted> at 162+ [2019-07-18 23:30:41] '30' <redacted> at 162+ [2019-07-18 23:31:21] '30' <redacted> at 162+
方案二:通用匹配(不依赖长度)
如果担心以后时间戳格式变化或者空格数调整,可以用更灵活的写法,适配任意数量的空格:
sed -E 's/(\[[^]]+\])\s*\[[^]]+\]/\1/'
这里的\s*会匹配第一组和第二组括号之间的任意空格(包括0个),兼容性更强。
这两个命令都可以直接放到你的bash管道里,不用拆分处理,完全符合管道多步命令的场景。
内容的提问来源于stack exchange,提问作者InterLinked
相关产品推荐
相关产品推荐

