如何通过awk与grep在提取的日志行前添加所属文件名
解决方案
直接修改现有awk命令(最优方案)
你可以直接把grep的过滤逻辑合并到awk中,同时调用FILENAME内置变量输出文件名前缀,避免额外管道开销,命令如下:
awk ' # 每个文件处理前重置标记,避免跨文件状态污染 FNR == 1 { flag = 0 } # 匹配到taskreporting启动时标记生效 /taskreporting start/ { flag = 1; next } # 匹配到taskreporting结束时标记失效 /taskreporting end/ { flag = 0 } # 标记生效且匹配到任务启停日志时,输出文件名+原行内容 flag && /Starting task|Finishing task/ { print FILENAME ":" $0 } ' a*.log
命令说明
- 直接将所有符合命名规则的
aYYYYMMDD.log文件作为awk的输入参数,awk会自动逐个处理 FNR是awk内置变量,代表当前处理文件的行号,每个文件的第一行处理时重置flag,避免上一个文件的标记状态影响后续文件处理- 命中输出条件时,
FILENAME会自动替换为当前行所属的日志文件名,和原内容用冒号分隔,方便区分来源
兼容原有写法的修改方案
如果你不想把grep逻辑合并到awk中,也可以修改原awk命令输出文件名,再通过管道传递给grep,性能略低于上面的合并方案:
awk '/taskreporting start/{flag=1;next}/taskreporting end/{flag=0}flag{print FILENAME ":" $0}' a*.log | grep 'Starting task\|Finishing task'
内容的提问来源于stack exchange,提问作者Boneist
相关产品推荐
相关产品推荐

