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..