Es macht mir wirklich Spaß control+r
, rekursiv in meinem Befehlsverlauf zu suchen. 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
nur sequentielle Duplikate gelöscht werden - so dass mit dieser Befehlsfolge:
ls
cd ~
ls
Der ls
Befehl wird tatsächlich zweimal aufgezeichnet. Ich habe darüber nachgedacht, regelmäßig mit cron zu laufen:
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 beibehalten. Wenn ich sort
die Datei nicht zuerst bekomme, uniq
kann sie meiner Meinung nach nicht richtig funktionieren.
Wie kann ich Duplikate in meiner .bash_history entfernen, wobei die Reihenfolge erhalten bleibt?
Zusätzliches Guthaben:
Gibt es Probleme beim Überschreiben der .bash_history
Datei über ein Skript? Wenn Sie beispielsweise eine Apache-Protokolldatei entfernen kill
, müssen Sie meines Erachtens ein Nohup / Reset-Signal mit senden, damit die Verbindung zur Datei wiederhergestellt wird. Wenn dies bei der .bash_history
Datei der Fall ist , kann ich möglicherweise irgendwie ps
überprüfen, ob keine Sitzungen verbunden sind, bevor das Filterskript ausgeführt wird.
ignoredups
statterasedups
für eine Weile und sehen Sie, wie das bei Ihnen funktioniert.history
Befehls nicht finden. Wo soll ich suchen?Antworten:
Die Geschichte sortieren
Dieser Befehl funktioniert wie
sort|uniq
folgt, behält jedoch die Zeilen beiGrundsätzlich wird jeder Zeile ihre Nummer vorangestellt. Danach
sort|uniq
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 nicht definiert ist, welcher Repräsentant einer Klasse gleicher Linien es in der Ausgabe macht, und daher ist seine Position in der endgültigen Ausgabe nicht definiert. Sollte jedoch der letzte Vertreter gewählt werden, können Sie
sort
die Eingabe mit einer zweiten Taste vornehmen:Verwalten von .bash_history
Zum erneuten Lesen und Zurückschreiben des Verlaufs können Sie
history -a
undhistory -w
verwenden.quelle
sort
dem-r
umkehrt Schalter immer die Sortierreihenfolge. Dies wird jedoch nicht das gewünschte Ergebnis bringen.sort
betrachtet die beiden Vorkommen vonls
als identisch mit dem Ergebnis, dass die endgültige Reihenfolge auch in umgekehrter Reihenfolge vom Sortieralgorithmus abhängt. Aber siehe mein Update für eine andere Idee.nl
am Anfang jeder Codezeile? Sollte es nicht seinhistory
?Also suchte ich genau das Gleiche, nachdem ich mich über Duplikate geärgert hatte, und stellte fest, dass ich, wenn ich mein ~ / .bash_profile (Mac) bearbeite, mit:
Es macht genau das, was Sie wollten, es hält nur den neuesten Befehl.
ignoreboth
ist eigentlich genauso wie zu tunignorespace:ignoredups
und das zusammen miterasedups
bekommt den Job erledigt.Zumindest auf meinem Mac-Terminal mit Bash funktioniert dies einwandfrei. Habe es hier auf askubuntu.com gefunden .
quelle
Fand diese Lösung in freier Wildbahn und getestet:
Wenn zum ersten Mal ein bestimmter Wert einer Zeile ($ 0) angezeigt wird, ist der Wert von x [$ 0] Null.
Der Wert von Null wird mit invertiert
!
und wird zu Eins.Eine Anweisung, die eins ergibt, löst die Standardaktion print aus.
Daher wird ein bestimmtes Objekt beim ersten Mal
$0
gedruckt.Bei jeder nächsten
x[$0]
Inkrementierung des Werts von (den Wiederholungen) ist dernegierte Wert Null, und eine Anweisung, die mit Null bewertet wird, wird nicht gedruckt.
Um den zuletzt wiederholten Wert beizubehalten, kehren Sie den Verlauf um und verwenden Sie dasselbe awk:
quelle
Erweiterung der Antwort von Clayton:
tac
Machen Sie die Datei rückgängig, stellen Sie sicher, dass Sie installiert haben,moreutils
damit Siesponge
verfügbar sind, andernfalls verwenden Sie eine temporäre Datei.quelle
brew install coreutils
und beachten Sie, dass bei allen GNU-Utils eing
vorangestellt ist, um Verwechslungen mit den in BSD integrierten Mac-Befehlen zu vermeiden (z. B. gsed ist GNU, sed ist BSD). Also benutzegtac
.Diese würden die letzten duplizierten Zeilen behalten:
quelle
Dies ist ein alter Beitrag, aber ein fortwährendes Problem für Benutzer, die mehrere Terminals geöffnet und den Verlauf zwischen Fenstern synchronisiert, aber nicht dupliziert haben möchten.
Meine Lösung in .bashrc:
history -n
Liest alle Zeilen aus $ HISTFILE, die seit dem letzten Wagenrücklauf in einem anderen Terminal aufgetreten sindhistory -w
schreibt den aktualisierten Puffer in $ HISTFILEhistory -c
löscht den Puffer, damit keine Duplizierung auftritthistory -r
liest die $ HISTFILE erneut und hängt sie an den jetzt leeren Puffer antac
Kehrt es um und kehrt es dann zurück, damit es mit den aktuellsten Befehlen gespeichert werden kann, die noch aktuell im Verlauf sindJedes Mal, wenn Sie eine neue Shell öffnen, werden im Verlauf alle Dupes gelöscht. Jedes Mal, wenn Sie die EnterTaste in einem anderen Shell- / Terminalfenster drücken, wird der Verlauf aus der Datei aktualisiert.
quelle
Es ist schwierig, jeden neuen Befehl eindeutig aufzuzeichnen. Zuerst müssen Sie hinzufügen
~/.profile
oder ähnlich:Dann müssen Sie hinzufügen
~/.bash_logout
:quelle