如何修改sed命令适配Java9+ 按类库统计加载的Java类数量
问题原因
你写的命令有3个核心问题:
- Mac自带的是BSD版本sed,扩展正则的参数是
-E而非GNU sed的-r,参数错误会导致正则解析异常 grep '[class,load]'的写法是字符组匹配,会匹配任意单个c/l/a/s/,/o/a/d字符,而非匹配完整的[class,load]标签- 原正则的捕获规则逻辑错误,没有正确匹配类名前的命名空间部分
修改后的完整命令
java -cp my.jar -verbose:class Handler | grep '\[class,load\]' | grep '\.jar' | sed -E 's/.*\[class,load\] ([^A-Z]*)[A-Z].*/\1/' | sed 's/\.$//' | sort | uniq -c | sort
逻辑说明
- 第一个
grep '\[class,load\]'准确过滤类加载日志行 - 第二个
grep '\.jar'仅保留从jar包加载的类 - 第一段sed命令捕获
[class,load]后到类名首字母大写前的所有内容 - 第二段sed命令删除捕获内容末尾多余的点(比如
java.io.Serializable捕获后会得到java.io.,去掉末尾点得到java.io) - 后续的排序、统计逻辑和原Java8版本一致
测试验证
对Java9+的样例日志行[0.041s][info][class,load] java.io.Serializable source: jrt:/java.base,执行上述sed逻辑后输出结果为java.io,符合预期。
内容的提问来源于stack exchange,提问作者DV82XL
相关产品推荐
相关产品推荐

