bold=$(tput bold) reset=$(tput sgr0) purple=$(tput setaf 171) green=$(tput setaf 76) tan=$(tput setaf 3) header() { printf "\n${bold}${purple}========== %s ==========${reset}\n" "$@" } arrow() { printf " ➜ %s\n" "$@" } success() { printf "${green} ✔ %s${reset}\n" "$@" } warning() { printf "${tan} ➜ %s${reset}\n" "$@" } function top_commands_full() { local filter="$1" local max_results=${2:-'50'} history | \cat | awk '{$1=$1};1' | sed 's/^[0-9\* TAB]*//g' | awk '{CMD[$0]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "%\t" a; }' | grep "$filter" | sort -nr | nl | head "-n$max_results" } function suggest_aliases() { local search_input_size=${1:-'50'} header "alias recommendations" while read -r line; do local matching_aliases=$(alias | grep -i "$line") if [ ! -z "$matching_aliases" ]; then success "there is an alias for $line :" while read -r alias_line; do arrow "$alias_line" done < <(echo "$matching_aliases") echo else warning "no alias for $line" fi done < <(top_commands_full "" "$search_input_size" | awk '{ $1=""; $2=""; $3=""; print}' | awk 'NF' | awk '{$1=$1};1' | awk -v COUNT=1 'NF>COUNT' | head "-$search_input_size") }