Wie lösche ich ausgewählte Ergebnisse aus dem Bash-Verlauf?

66

historyBefehl zeigt alle Ergebnisse an, aber wir können filtern, um einen bestimmten Befehl mit zu erhalten history | grep searchingCommand. Es ist sehr hilfreich.

Das Problem ist jedoch, dass auch die Befehle angezeigt werden, die mit Tippfehlern eingegeben wurden oder die nicht erfolgreich waren. Dann ist es wirklich ein Schmerz, den richtigen zu finden. Ich habe diesen Link überprüft: Selektive Befehlshistorie im Terminal? aber das war nicht meine lösung.

Gibt es eine Möglichkeit, die Befehle aus dem Verlauf zu löschen, die zu dem eingegebenen Zeitpunkt oder später falsch waren?

Saurav Kumar
quelle
5
Bitte ändern Sie die akzeptierte Antwort, es gibt andere mit mehr als 100 Stimmen.
Greuze
1
@greuze: Geändert zur besten Antwort. Stimmenzahl bedeutet nicht, dass es das Beste ist!
Saurav Kumar

Antworten:

20

Ich möchte eine weitere Methode zum Ändern (oder Löschen) von Verlaufseinträgen hinzufügen, die ich eher zufällig bei der Arbeit mit der Bash gefunden habe:

Um dies zu demonstrieren, führen Sie zunächst die folgenden drei Befehle in bash aus:

$ echo 1
1
$ echo 2
2
$ echo 3
3

Sie können diese Befehle jetzt wieder mit den Pfeiltasten oder Ctrl+ pund Ctrl+ auswählen n.

Angenommen, Sie möchten die ersten beiden Befehle ändern. Blättern Sie durch den Verlauf, bis echo 1angezeigt wird, und ändern Sie ihn in echo 1 - changed. Drücken Sie jedoch nicht die Eingabetaste. Wenn Sie sich jetzt weiter in Ihrem Verlauf bewegen, bleibt diese Zeile in ihrem geänderten Zustand und Sie können sich von ihr entfernen und zurück zu ihr bewegen. Bewegen Sie sich nun zu der Zeile echo 2und ändern Sie sie echo 2 - changedin. Drücken Sie erneut nicht die Eingabetaste. Um die Änderungen in diesen Zeilen zu speichern, wählen Sie einen beliebigen Befehl im Verlauf aus, mit Ausnahme dieser beiden, und drücken Sie Ctrl+ c.

Anstatt den Verlaufseintrag zu ändern, können Sie ihn natürlich auch entfernen, was zu einer leeren Zeile an diesem Eintrag führt. Um die aktuell an der Eingabeaufforderung angezeigte Zeile zu löschen, drücken Sie Ctrl+ e(springt zum Zeilenende), gefolgt von Ctrl+ u(löscht den Text vom Zeilenanfang bis zum Cursor).

Siehe auch https://unix.stackexchange.com/questions/195668/what-can-cause-an-item-to-leleted-from-my-bash-history/195726#195726 für eine detailliertere Erklärung der technischer Hintergrund.

Einfachster Weg:

  1. ctrl+ r, um den Befehl zu suchen, den Sie löschen / ändern möchten.
  2. end um den gesuchten Befehl zum Löschen / Ändern auszuwählen
  3. Lösche oder ändere den ausgewählten Befehl (drücke nicht enteroder ctrl+ c)
  4. Pfeil nach oben (oder ctrl+ p) oder Pfeil nach unten (oder ctrl+ n), um einen anderen Befehl auszuwählen.
  5. ctrl+ c Das war's!

Hinweis :

Dies ändert nur die aktuellen Sitzungsbefehle. Wenn wir ältere Befehle ändern und die Änderungen speichern möchten, müssen wir vor dem Schließen des Terminals den folgenden Befehl ausführen:

history -w
Stefan Hamcke
quelle
Vielen Dank Stefan! Ich muss sagen, dass du tolle Dinge mitgebracht hast. Auf diese Weise habe ich den einfachsten Weg gefunden, den Verlauf zu ändern / löschen: 1.ctrl+r Den Befehl zu suchen, den Sie löschen / ändern möchten. 2.end um den Befehl zu verschieben und zu löschen / ändern. 3.ctrl+n zur nächsten Zeile und dann 4.ctrl+c
Saurav Kumar
144

Verwenden:

history -d OFFSET

um den Verlaufseintrag am Versatz zu löschen, OFFSETnoch bevor er zu Ihrer Bash-Verlaufsdatei hinzugefügt wurde. Um das Richtige herauszufinden OFFSET, müssen Sie nur den historyBefehl ausführen . Es ist die Nummer vom Anfang der Zeile, die den Verlaufseintrag enthält, den Sie löschen möchten.

Und um die Änderungen an der Historie zu speichern, verwenden Sie:

history -w

Weitere Einzelheiten finden Sie in diesem Handbuch .

user299481
quelle
nicht schlecht :) Gut, um einen neuen Weg zu bekommen ..
Saurav Kumar
10
@SauravKumar Nicht schlecht?!? Wahrscheinlich ist der beste Weg ...
Radu Rădeanu
5
LESEN SIE ZUERST: Um sicherzugehen, müssen Sie Nachwörter history -weingeben, um die Änderungen zu speichern. OFFSET bedeutet auch, welche Nummer historyangezeigt wird. Wenn die zu löschende Zeile 873 ist, verwenden Sie history -d 873.
Cammy_the_block
2
@ RaduRădeanu Verwendung history -wnach history -dÄnderungen zu speichern.
Cammy_the_block
20
Dies sollte die richtige Antwort sein.
Topher
19

Bearbeite die Datei ~/.bash_historyund lösche die einmal mit Tippfehlern

Fügen Sie beispielsweise diesen Befehl ein:

gedit ~/.bash_history

Bearbeiten Sie etwas, das Ihnen gefällt, und speichern Sie anschließend die Datei und starten Sie das Terminal neu. Der root-Befehl lautet:

sudo -i 
inser your password
gedit ~/.bash_history

Wenn Sie alle löschen möchten, history -csollten Sie den Trick machen


SYNTAX

history
history [n]
history -c
history -d offset
history [-anrw] [filename]
history -ps arg

SCHLÜSSEL

-c Löscht die Verlaufsliste. Dies kann mit den anderen Optionen kombiniert werden, um die Verlaufsliste vollständig zu ersetzen.

-d Versatz Löscht den Historieneintrag am Positionsversatz. Der Versatz sollte so angegeben werden, wie er angezeigt wird, wenn der Verlauf angezeigt wird.

-a Hängt die neuen Verlaufszeilen (die seit Beginn der aktuellen Bash-Sitzung eingegebenen Verlaufszeilen) an die Verlaufsdatei an.

-n Hängt die noch nicht gelesenen Verlaufszeilen aus der Verlaufsdatei an die aktuelle Verlaufsliste an. Dies sind Zeilen, die seit Beginn der aktuellen Bash-Sitzung an die Verlaufsdatei angehängt wurden.

-r Liest die aktuelle Verlaufsdatei und hängt ihren Inhalt an die Verlaufsliste an.

-w Schreibe den aktuellen Verlauf in die Verlaufsdatei.

-p Führt eine Verlaufssubstitution für die Args durch und zeigt das Ergebnis in der Standardausgabe an, ohne die Ergebnisse in der Verlaufsliste zu speichern.

-s Die Argumente werden als einzelner Eintrag am Ende der Verlaufsliste hinzugefügt.

Quelle :

blade19899
quelle
Danke, es ist hilfreich! Wissen Sie, wie Sie den Eintrag zum Zeitpunkt der Eingabe über die Befehlszeile löschen können? Oder gibt es irgendeinen Befehl, um den Eintrag zu löschen, ohne den zu öffnen .bash_history?
Saurav Kumar
1
@bladed19899 history -cfunktioniert nicht Wenn ich das Terminal schließe und wieder öffne, werden die Historien nicht gelöscht. -1 Ihre Antwort
αғsнιη
1
@ KasiyA, -c Clear the history list. This may be combined with the other options to replace the history list completely. Quelle
blade19899
2
@KasiyA Verwenden Sie history -wafter history -c, um die Änderungen zu schreiben.
Cammy_the_block
16

Wenn Sie es sofort aus demselben Terminal löschen möchten, müssen Sie Folgendes zu Ihrer ~ / .bashrc-Datei hinzufügen.

PROMPT_COMMAND='history -a' 

und starten Sie Ihr Terminal neu.

Sie können es überall in der .bashrc-Datei hinzufügen.

Bildbeschreibung hier eingeben

In der Regel werden die ausgeführten Befehle während einer Bash-Sitzung erst nach Beendigung der Sitzung in .bash_history geschrieben. Geben Sie PROMPT_COMMAND='history -a'den Befehl dann und dort in .bash_history ein.

Wenn Sie nun in einem Befehl einen Fehler machen und ihn dann löschen möchten, führen Sie einfach Folgendes aus

sed -i '$d' ~/.bash_history

und tada es würde gelöscht.

Um es einfacher zu machen, können Sie es an etwas Einfacheres aliasen und es wie verwenden

alias rh ='sed -i '\''$d'\'' ~/.bash_history'

Wenn Sie also ausführen, rhwird der zuletzt ausgeführte Befehl aus dem Verlauf entfernt.

Das obige ist ein temporäres Aliasing, das nur für eine Sitzung gilt. Damit wird es permanent oder dauerhaft hinzugefügt

alias rh = 'sed -i '\''$d'\'' ~/.bash_history' 

zu .bashrc

HINWEIS

Auf beiden Seiten von sollte kein Platz sein =

Wenn Sie keinen Alias ​​erstellen möchten, können Sie auch Folgendes tun

Machen Sie einen Kommadennamen rhund platzieren Sie ihn im /binVerzeichnis:

  • Öffne eine Datei rhund füge folgenden Code ein, speichere und schließe:

    sed -i '$d' ~/.bash_history

  • Machen Sie rhausführbare Datei und legen Sie sie in /binVerzeichnis:

     chmod + x rh
     sudo cp rh / bin 
  • Verwenden Sie nun den rhBefehl, um den letzten Befehl aus dem Verlauf zu löschen.

Stormvirux
quelle
Wo hinzufügen PROMPT_COMMAND='history -a'in - .bashrcDatei? Und was genau wird es tun? Ich habe versucht, sed -i '$d' ~/.bash_historyes funktioniert ohne Bearbeitung .bashrc! Aber Alias ​​Ding funktioniert nicht .. Ich werde Ihre Antwort akzeptieren, wenn Sie nur meine Frage ausarbeiten und dafür sorgen, dass Alias ​​funktioniert .. :)
Saurav Kumar
@SauravKumar haben die Antwort bearbeitet. Hatte die einfachen und doppelten Anführungszeichen im Aliasing-Befehl verpasst .. Meine schlechte ..: P
Stormvirux
Ob Sie mir glauben oder nicht, das Alias-Ding funktioniert immer noch nicht. Es wird fehlerfrei ausgeführt, löscht jedoch nicht den Eintrag aus der .bash_historyDatei /binVerzeichnis. Denn aufgrund Ihres Befehls: sed -i "$d" ~/.bash_historyEs funktioniert gut. Ich akzeptiere deine Antwort .. :)
Saurav Kumar
Wenn es Ihnen nichts ausmacht, möchte ich Ihre Antwort so bearbeiten, dass sie für andere hilfreich ist.
Saurav Kumar
Eigentlich habe ich es bearbeitet. Sie müssen es genehmigen ..
Saurav Kumar
2

um mehrere Zeilen zu entfernen (zB von 1974 bis 1990, mit historyBefehl prüfen ):

  for i in `seq 1974 1990` ; do history -d 1974 ; done

Beachten Sie, dass die zu entfernende Zeilennummer immer dieselbe ist, da Sie diese ständig entfernen und zum nächsten wechseln.

törzsmókus
quelle
Der Hinweis ist sehr wichtig.
Weijun Zhou
1

Wenn Sie in bash die Option "set -o vi" verwenden (sehr nützlich, um mit der Escape-Taste zurückzusuchen), können Sie nach der Zeile suchen und die Zeile mit "dd" löschen, genau wie in "vi".

Der IT-Typ
quelle
Ich finde, dass ich tippen muss joder kdanach dd, um den Befehl tatsächlich aus der Geschichte zu löschen. Wenn ich einen anderen Befehl Entereingebe oder einfach drücke , geht bash davon aus, dass es sich nur um einen neuen Befehl handelt und dass der alte Befehl im Verlauf beibehalten werden soll. Es ist auch interessant zu bemerken, dass der Befehl gelöscht, aber nicht gelöscht wird, wenn er richtig ausgeführt wird. Das Ergebnis sind leere Verlaufseinträge. Aber dies ist gut genug, um Passwörter zu entfernen, die ich an der Befehlszeile eingeben musste, und viel einfacher als andere Antworten. Vielen Dank, dass Sie dies gepostet haben!
Michael Scheper
0

Ich hatte eine Situation, in der ich überflüssige Einträge in meinem Bash-Verlauf von einem Yubikey hatte - vielleicht 50 oder so, passend zu 'ccccc .....'. Idealerweise wollte ich eine Möglichkeit zum Löschen von Einträgen, die mit einem Muster übereinstimmen, was Sie vermutlich mit sed oder etwas anderem tun könnten, vorausgesetzt, Ihr Verlauf ignoriert Leerzeichen.

Wie auch immer, ich wurde faul und benutzte schließlich vim, suchte nach "cccc" und benutzte "dd", während ich durch jedes Match fuhr. Dauerte nicht länger als eine Minute.

Dylan_Larkin
quelle
1
Wenn Sie dies in vim tun, können Sie auch Folgendes tun: g / cccc / d oder: g / ^ cccc / d: oder ein Makro qqnddq dann @@ verwenden (vorausgesetzt, Ihre letzte Suche war nach ccccc).
Htaccess
@htaccess Das wäre sicherlich einfacher gewesen, aber ich wollte irgendwie gleichzeitig den Rest der Datei visuell untersuchen.
Dylan_Larkin