sed执行报错can't find label,如何删除含EntityFramework的多行debug日志
问题解决方案
错误原因
- 语法层面:你使用的sed分支标签写法存在分隔符缺失问题,不同发行版的sed(GNU sed/BSD sed)对单行内的标签、跳转语法的解析规则不同,未正确用分号分隔标签和后续逻辑会导致sed无法识别到定义的
b标签,触发跳转失败报错。 - 逻辑层面:原有命令的匹配规则会删除所有包含
EntityFramework的行,会误删你需要保留的info级别的EntityFramework迁移日志,不符合仅删除debug级EF日志的需求。
可直接运行的解决方案
适用Linux系统(默认GNU sed)
执行如下命令即可实现需求:
sed -i '/^dbug/{:a;N;/\n[[:lower:]]/!ba;/EntityFramework/d}' logs
命令逻辑说明:
- 匹配所有以
dbug开头的行作为debug日志块的起始 - 定义标签
:a,持续追加下一行到当前处理缓存,直到读取到下一行以小写字母开头的内容(即下一条独立日志的起始行)停止追加 - 校验当前缓存的整个debug日志块是否包含
EntityFramework字符串,是则删除整个块,否则保留输出
适用macOS/BSD系统
自带的sed为BSD版本,-i参数需要额外指定空备份后缀,命令调整为:
sed -i '' '/^dbug/{:a;N;/\n[[:lower:]]/!ba;/EntityFramework/d}' logs
效果验证
对给出的示例日志执行命令后,输出内容如下:
info: Microsoft.EntityFrameworkCore.Migrations[20405] No migrations were applied. The database is already up to date. warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60] Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed. info: Hangfire.PostgreSql.PostgreSqlStorage[0] Start installing Hangfire SQL objects...
完全符合保留非debug EF日志、其他级别日志,仅删除debug级EF日志的需求,处理2GB级大文件时sed为流式处理,不会占用过多内存,执行效率很高。
内容的提问来源于stack exchange,提问作者Arnaud F.
相关产品推荐
相关产品推荐

