#! /bin/bash target_module="$1" target_fun_regex="$2" shift 2 dirs=$@ find $dirs -type f -name '*.erl' -exec grep -Hn "\<$target_module\>:" '{}' \; \ | sed 's/%.*$//g' \ | awk \ -F "${target_module}:" \ -v target_module="$target_module" \ -v target_fun_regex="$target_fun_regex" ' $1 && $2 { caller_module_file = $1 sub(":.*$", "", caller_module_file) called_function = $2 sub("\\(.*$", "", called_function) if (called_function ~ /^[a-z][a-zA-Z_0-9]+$/) { if (called_function ~ target_fun_regex) { Calls[called_function]++ Calls_from[caller_module_file, called_function]++ Caller_modules[caller_module_file]++ } } else { printf \ "[WARN] skipped an invalid erlang function name. File: \"%s\", function: \"%s\", original line: \"%s\"\n", \ caller_module_file, called_function, $0 \ > "/dev/stderr" } } END { indent = " " print "group-by-caller" for (caller_module_file in Caller_modules) { printf "%s%s\n", indent, caller_module_file; for (cf in Calls_from) { split(cf, call, SUBSEP); if (call[1] == caller_module_file) printf "%s%s\n", indent indent, call[2] | "sort"; } close("sort") } print "all" for (called_function in Calls) printf "%s%s\n", indent, called_function | "sort" close("sort") }'