GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie entferne ich Duplikate in der .bash_history, um die Reihenfolge beizubehalten?

Ich genieße wirklich die Verwendung von control+r meine Befehlshistorie rekursiv durchsuchen. Ich habe ein paar gute Optionen gefunden, die ich gerne damit verwende:

# ignore duplicate commands, ignore commands starting with a space
export HISTCONTROL=erasedups:ignorespace

# keep the last 5000 entries
export HISTSIZE=5000

# append to the history instead of overwriting (good for multiple connections)
shopt -s histappend

Das einzige Problem für mich ist, dass erasedups löscht nur aufeinanderfolgende Duplikate – also mit dieser Befehlsfolge:

ls
cd ~
ls

Die ls Befehl wird tatsächlich zweimal aufgezeichnet. Ich habe darüber nachgedacht, regelmäßig w/ cron auszuführen:

cat .bash_history | sort | uniq > temp.txt
mv temp.txt .bash_history

Dies würde das Entfernen der Duplikate erreichen, aber leider würde die Reihenfolge nicht erhalten bleiben. Wenn ich nicht sort Die Datei zuerst glaube ich nicht uniq richtig funktionieren kann.

Wie kann ich Duplikate in meiner .bash_history entfernen und dabei die Reihenfolge beibehalten?

Zusätzlicher Kredit:

Gibt es Probleme beim Überschreiben der .bash_history Datei über ein Skript? Wenn Sie beispielsweise eine Apache-Protokolldatei entfernen, müssen Sie meiner Meinung nach ein nohup / reset-Signal mit kill senden damit es seine Verbindung zur Datei löscht. Wenn das bei der .bash_history der Fall ist Datei, vielleicht könnte ich irgendwie ps verwenden überprüfen und sicherstellen, dass keine verbundenen Sitzungen vorhanden sind, bevor das Filterskript ausgeführt wird?

Akzeptierte Antwort:

Sortieren des Verlaufs

Dieser Befehl funktioniert wie sort|uniq , behält aber die Linien bei

nl|sort -k 2|uniq -f 1|sort -n|cut -f 2

Grundsätzlich wird jeder Zeile ihre Nummer vorangestellt. Nach sort|uniq -ing werden alle Zeilen gemäß ihrer ursprünglichen Reihenfolge (unter Verwendung des Zeilennummernfelds) zurücksortiert und das Zeilennummernfeld wird aus den Zeilen entfernt.

Diese Lösung hat den Fehler, dass es undefiniert ist, welcher Repräsentant einer Klasse gleicher Linien es in die Ausgabe schafft, und daher ist seine Position in der endgültigen Ausgabe undefiniert. Wenn jedoch der neueste Vertreter ausgewählt werden soll, können Sie sort die Eingabe durch eine zweite Taste:

nl|sort -k2 -k 1,1nr|uniq -f1|sort -n|cut -f2

.bash_history verwalten

Zum erneuten Lesen und Zurückschreiben des Verlaufs können Sie history -a verwenden und history -w bzw..

Verwandte:Bash-Skripte beim Betreten eines Verzeichnisses ausführen?
Linux
  1. So verwenden Sie den Verlaufsbefehl unter Linux

  2. So entfernen Sie Benutzer in Linux über die Befehlszeile

  3. Wie greife ich in Unix on the Fly auf den Verlauf zu?

  4. Wie entferne ich die Bom aus einer UTF-8-Datei?

  5. Wie entferne ich eine einzelne Zeile aus dem Verlauf?

So entfernen Sie Duplikate in LibreOffice

So entfernen Sie die Verknüpfungen in Google Chrome

So löschen Sie den Verlauf in Google Chrome

So verwenden Sie den Verlaufsbefehl unter CentOS 8

So entfernen Sie einen Befehl aus dem Verlauf in Linux

So verwenden Sie „Yum-Verlauf“, um installierte oder entfernte Pakete herauszufinden