Löschen Sie die letzten N Zeilen aus dem Bash-Verlauf

40

Beim versehentlichen Einfügen einer Datei in die Shell werden eine Menge hässlicher Unsinneinträge in den Bash-Verlauf eingefügt. Gibt es eine saubere Möglichkeit, diese Einträge zu entfernen? Natürlich könnte ich die Shell schließen und die .bash_historyDatei manuell bearbeiten, aber vielleicht gibt es eine API, um den Verlauf der aktuellen Shell zu ändern?

Diebesmeister
quelle

Antworten:

36

Sie können history -d offsetbuiltin verwenden, um eine bestimmte Zeile aus dem Verlauf der aktuellen Shell zu löschen oder history -cum den gesamten Verlauf zu löschen .

Es ist nicht wirklich praktisch, wenn Sie einen Bereich von Zeilen entfernen möchten, da nur ein Offset als Argument verwendet wird, aber Sie können ihn in eine Funktion mit einer Schleife einschließen.

rmhist() {
    start=$1
    end=$2
    count=$(( end - start ))
    while [ $count -ge 0 ] ; do
        history -d $start
        ((count--))
    done
}

Nennen Sie es mit rmhist first_line_to_delete last_line_to_delete. (Zeilennummern entsprechend der Ausgabe von history.)

(Verwenden Sie history -wdiese Option , um ein Schreiben in die Verlaufsdatei zu erzwingen.)

Matte
quelle
1
Da das OP nach dem Löschen der N letzten Zeilen gefragt hat , sollte dieses Skript folgendermaßen geändert werden: tot_lines=$(history | wc -l)und dann wiederholt werden history -d $(( tot_lines - $1 )).
PlasmaBinturong
2
Stattdessen $(history | wc -l)gibt es die Variable $HISTCMD, die verwendet werden kann.
PlasmaBinturong
29

Nur diese eine Zeile in der Eingabeaufforderung hilft.

for i in {1..N}; do history -d START_NUM; done

Wobei START_NUM die Startposition des Eintrags in der Historie ist. N ist die Anzahl der Einträge, die Sie löschen möchten.

Ex: for i in {1..50}; do history -d 1030; done

user2982704
quelle
3
Ich frage mich, warum dies nicht bereits eine eingebaute Funktion ist. "Geschichte" ist ein sehr altes Werkzeug.
Petr Gladkikh
dient dem Zweck sehr gut, aber dieser Befehl kann in der Geschichte gesehen werden :)
Rajeev Akotkar
askubuntu.com/a/978276/22866 hat eine schöne Möglichkeit, den Befehl "Aus Verlauf löschen" aus dem Verlauf zu löschen :-)
HanSooloo
0

Die Antwort von user2982704 hat bei mir fast geklappt aber nicht ganz. Ich musste eine kleine Variation davon machen.

Angenommen, mein Verlauf liegt bei 1000 und ich möchte die letzten 50 Einträge löschen

start=1000

for i in {1..50}; do count=$((start-i)); history -d $count; done
Aberpaul
quelle