我使用此命令搜索 *.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 {} +