如何用SED删除日志中[dd-mmm-yyyy hh:mm:ss]格式的重复日期
用Sed删除日志中特定格式的前置日期
需求场景
处理日志流时,部分日志记录包含两种格式的日期:
- 需删除的格式:
[dd-mmm-yyyy hh:mm:ss](例如[27-Jan-2023 17:21:42]) - 需保留的格式:
[yyyy-mm-dd hh:mm:ss](例如[2023-01-27 17:21:42])
目标是删除每条日志中前置的dd-mmm-yyyy格式日期,仅保留yyyy-mm-dd格式的日期及后续内容;对于只有yyyy-mm-dd格式日期的日志行,保持原样。
正确的Sed命令
方式一:使用扩展正则表达式(推荐)
GNU Sed使用-r参数,BSD/macOS Sed使用-E参数,启用扩展正则表达式后无需转义量词{}:
# GNU Sed sed -r 's/\[[0-9]{2}-[A-Za-z]{3}-[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}\] //' logfile.txt # macOS/BSD Sed sed -E 's/\[[0-9]{2}-[A-Za-z]{3}-[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}\] //' logfile.txt
方式二:使用基础正则表达式
如果无法使用扩展正则,需转义{}:
sed 's/\[[0-9]\{2\}-[A-Za-z]\{3\}-[0-9]\{4\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\] //' logfile.txt
直接修改原文件
若要直接修改日志文件而非输出到终端,添加-i参数(注意不同系统的差异):
# GNU Sed sed -i -r 's/\[[0-9]{2}-[A-Za-z]{3}-[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}\] //' logfile.txt # macOS/BSD Sed sed -i '' -E 's/\[[0-9]{2}-[A-Za-z]{3}-[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}\] //' logfile.txt
命令说明
- 正则表达式
\[[0-9]{2}-[A-Za-z]{3}-[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}\]精准匹配需删除的日期格式(注意末尾的空格),替换为空字符串即可移除该部分。 - 对于仅包含目标日期的日志行,由于不匹配上述正则,不会被修改,直接保留原内容。
之前尝试失败的原因
- 第一个命令未启用扩展正则:Sed默认使用基础正则表达式,
{}作为量词时必须转义,否则会被当作普通字符处理,导致匹配失败。 - 第二个命令正则逻辑错误:
\[[^][]*\] $会尝试匹配行尾的[]内容,但前置日期后并非行尾(而是空格+目标日期),且未定义捕获组就使用\1,逻辑完全不匹配需求。
内容的提问来源于stack exchange,提问作者manuerumx
相关产品推荐
相关产品推荐

