108 lines
2.9 KiB
Bash
Executable File
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
|
|
}
|