Files
at2-root-scripts/z_aliases_stats.sh
2025-04-13 16:14:17 +02:00

108 lines
2.9 KiB
Bash
Executable File

#!/bin/zsh
# Script Version: 1.5
# Description: Sucht ausschließlich den Alias a='ansible ' in der Zsh-History
N=${1:-50} # Anzahl der anzuzeigenden Einträge (Standard: 50)
HISTORY_FILE="$HOME/.zsh_history"
# Prüfen, ob die History-Datei existiert und lesbar ist
if [[ ! -f "$HISTORY_FILE" ]]; then
echo "[ERROR] History-Datei nicht gefunden: $HISTORY_FILE"
exit 1
elif [[ ! -r "$HISTORY_FILE" ]]; then
echo "[ERROR] Keine Leserechte für History-Datei: $HISTORY_FILE"
exit 1
fi
# Aliase aus der aktuellen Zsh-Umgebung laden
if ! source "$HOME/.zshrc" 2>/dev/null; then
echo "[WARNING] Konnte .zshrc nicht laden - verwende nur History-Daten"
fi
# Aliase mit Definitionen erfassen (nur a berücksichtigen)
typeset -A ALIAS_DEFS
for line in "${(@f)$(alias -L)}"; do
if [[ $line =~ ^alias\ ([^=]+)=[\'\"]?(.*)[\'\"]?$ ]]; then
name=${match[1]}
def=${match[2]}
# Nur Alias "a" speichern
if [[ $name == "a" ]]; then
ALIAS_DEFS[$name]=$def
fi
fi
done
# Alias-Namen als Array (nur a)
ALIASES=("a")
# Falls keine Aliase vorhanden sind, abbrechen
if [[ ${#ALIASES[@]} -eq 0 ]]; then
echo "[ERROR] Kein Alias 'a' gefunden."
exit 1
fi
# Alias-Pattern erstellen (nur für a)
ALIAS_PATTERN="^a(;|[ \t\n]|$)"
# Debug-Ausgabe
echo "[DEBUG] Gefundene Aliase: ${(kv)ALIAS_DEFS}"
echo "[DEBUG] Verwendetes Alias-Pattern: $ALIAS_PATTERN"
# History analysieren mit LC_ALL=C für konsistente Kodierung
LC_ALL=C awk -F';' -v aliases="$ALIAS_PATTERN" -v alias_defs="${(j:||:)${(kv)ALIAS_DEFS}}" '
BEGIN {
invalid_lines = 0
# Alias-Definitionen parsen
if (alias_defs != "") {
n = split(alias_defs, pairs, "||")
for (i = 1; i <= n; i += 2) {
DEFINITIONS[pairs[i]] = pairs[i+1]
}
}
}
{
if (NF < 2 || $1 !~ /^:[ 0-9]+:[0-9]+$/) {
invalid_lines++
next
}
cmd = substr($0, index($0, ";") + 1)
sub(/^[ \t]+/, "", cmd)
sub(/[ \t]+$/, "", cmd)
if (cmd == "") {
invalid_lines++
next
}
if (cmd ~ aliases) {
split(cmd, words, /[ \t;]/)
alias_name = words[1]
if (alias_name == "a") { # Nur a zählen
if (alias_name in CMD) {
CMD[alias_name]++
} else {
CMD[alias_name] = 1
}
count++
}
}
}
END {
if (invalid_lines > 0) {
print "[WARNING] Ignorierte " invalid_lines " ungültige History-Einträge" > "/dev/stderr"
}
if (count > 0) {
for (a in CMD) {
def = (a in DEFINITIONS) ? DEFINITIONS[a] : "undefined"
print CMD[a], CMD[a]*100/count "%", a "=" def
}
} else {
print "[ERROR] Keine Aufrufe von a in der History gefunden" > "/dev/stderr"
exit 1
}
}' "$HISTORY_FILE" | sort -nr | head -n "$N" | column -c4 -s " " -t | nl || {
echo "[ERROR] Fehler bei der Verarbeitung der History-Datei"
exit 1
}