在 jar 中搜索类名

在 jar 中搜索类名

我使用此命令搜索 *.jar 文件中的 java 类,并且仅获取包含这些类的 jar 的名称:

grep -ral --include=*.jar SignonEJB .

我怎样才能获得输出中的类名?

答案1

您传递了该-l选项,指示grep仅列出文件名。这是文件的名称.jar,不涉及其他文件。

如果要grep输出类名,则需要删除-l.但这会在同一“行”上打印很多其他垃圾,因为 jar 是二进制文件,不是按行组织的。 (使用 GNU grep,您需要传递-a才能获得该输出,而不仅仅是“二进制文件……匹配”。)

使用 GNU grep,一种可能性是匹配完整的类名并传递-o到输出:

grep -rao --include='*.jar' '[0-9A-Z_a-z]*SignonEJB[0-9A-Z_a-z]*' .

或者如果您也想要这些包裹

grep -rao --include='*.jar' '[$./0-9A-Z_a-z]*SignonEJB[0-9A-Z_a-z]*' .

strings另一种方法是首先在文件上运行以提取可打印字符串。 (这两个命令是等效的;sed 版本会阻塞\&和换行,而 awk 版本支持所有字符。)

find . -name '*.jar' -exec sh -c 'strings "$0" | grep SignonEJB | sed "s&^&$0&"' {} \;
find . -name '*.jar' -exec sh -c 'strings "$0" | jar=$0 awk "/SignonEJB/ {print ENVIRON[\"jar\"] \":\" $0}"' {} \;

或者(严格来说,更可靠,即使使用grep不太可能出现误报),使用unzip列出文件名并对其进行过滤。

find . -name '*.jar' -exec sh -c 'unzip -l -- "$0" | grep SignonEJB' {} \;

答案2

也许(使用 GNU 工具):

grep -ralZ --include='*.jar' SignonEJB . |
  xargs -r0IJ unzip -l J '*SignonEJB*.class'

或者,也许更可靠一些并且输出更容易阅读:

find . -name '*.jar' -exec sh -c 'export i; for i do
    zipinfo -1 "$i" | awk '\''/SignonEJB.*\.class$/{
      print ENVIRON["i"] ": " $0}'\''; done' sh {} +

相关内容