如何用sed/awk按唯一pid过滤特定组件的日志行
按组件+唯一PID过滤日志行的解决方案
针对你这种按组件分组、每个PID只保留首条日志的需求,用awk就能快速搞定,不用写复杂脚本。
通用方案(处理所有组件,保留每个PID的首行)
直接运行这条命令,就能输出你想要的结果:
awk -F'|' '!seen[$5,$6]++ || /^$/' your_log_file.log
命令解释:
-F'|':告诉awk日志字段用|分隔!seen[$5,$6]++:$5是组件名(比如componentA),$6是PID,用这两个组合作为唯一标识。第一次遇到某组件+PID的组合时,seen数组值为0,取反后为真,输出该行;之后再遇到同一组合时,seen值递增,取反为假,跳过该行|| /^$/:保留日志里的空行,维持原有的组件分组结构
针对特定组件的过滤(比如只处理componentA)
如果只想对某个组件去重PID,其他组件保持原样,用这条:
awk -F'|' '/^$/ {print; next} $5 == "componentA" {if(!seen[$6]++) print; next} 1' your_log_file.log
命令解释:
/^$/ {print; next}:遇到空行直接打印,然后跳过后续判断$5 == "componentA" {if(!seen[$6]++) print; next}:只对componentA的行,按PID去重,保留首行1:其他所有行(非componentA的)正常打印,如果不需要保留其他组件,删掉1即可
把your_log_file.log换成你的实际日志文件名就行,测试下来完全匹配你要的输出格式。
内容的提问来源于stack exchange,提问作者Varun Chawla
相关产品推荐
相关产品推荐

