代码之家  ›  专栏  ›  技术社区  ›  DV82XL

使用sed获取每个库加载的java类的计数

  •  1
  • DV82XL  · 技术社区  · 3 年前

    AWS re:invent presentation 在pp.33-34的Lambda performance(强烈推荐)中,作者使用以下命令列出了每个库中加载的类数:

    java -cp my.jar -verbose:class Handler | grep '\[Loaded' | grep '.jar\]' | sed -r 's/\[Loaded \([^A-Z]*\)[\$A-Za-z0-9]*from.*\]/\1/g' | sort | uniq -c | sort
    

    143 com.fasterxml.jackson
    219 org.apache.http
    373 com.google
    507 com.amazonaws
    

    java.io ):

    [Loaded java.io.Serializable from shared objects file]
    

    [0.041s][info][class,load] java.io.Serializable source: jrt:/java.base
    

    sed 命令是否需要更新以产生与上述相同的输出?

    我尝试了以下方法,但整行代码都是在regex组中提取的,而不仅仅是类库。我也在Mac电脑上运行,所以我必须添加一个 -r 标记并删除一些转义字符:

    java -cp my.jar -verbose:class Handler | grep '[class,load]' | grep '.jar' | sed -r 's/.*\[class,load\] ([^A-Z]*)[$A-Za-z0-9]*source.*/\1/g'
    
    1 回复  |  直到 3 年前
        1
  •  2
  •   LMC    3 年前

    因为记录中的字段是分隔的,所以我们可以利用 cut 获取所需字段,然后使用 sed 提取包子字符串。这个 ([a-z.]+)\.[A-Z].*

    echo "[0.041s][info][class,load] java.io.Serializable source: jrt:/java.base" | cut -d ' ' -f2 | sed -r 's/([a-z.]+)\.[A-Z].*/\1/g'
    

    结果:

    java.io
    

    如果 塞德 grep 还有工作:

    echo "[0.041s]..." | sed -nr '/class,load/ s/[^ ]+ ([^ ]+)/\1/ ; s/([a-z.]+)\.[A-Z].*/\1/p'
    

    /class,load/
    削减: s/[^ ]+ ([^ ]+)/\1/
    摘录: s/([a-z.]+)\.[A-Z].*/\1/p

        2
  •  0
  •   sseLtaH    3 年前

    sed 如果您的预期输出为 java.io

    sed -E 's/.*] ([a-z]*\..[^.]*).*/\1/' $file
    

    同样的道理也可以通过 grep

    grep -Po '.*] \K[a-z]*\..[^.]' $file