Mi piace molto usare control+r
per cercare ricorsivamente la cronologia dei miei comandi. Ho trovato alcune buone opzioni che mi piace usare con esso:
# 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
L'unico problema per me è che erasedups
cancella solo i duplicati sequenziali, in modo che con questa stringa di comandi:
ls
cd ~
ls
Il ls
il comando verrà effettivamente registrato due volte. Ho pensato di eseguire periodicamente con cron:
cat .bash_history | sort | uniq > temp.txt
mv temp.txt .bash_history
Ciò consentirebbe di rimuovere i duplicati, ma sfortunatamente l'ordine non verrebbe mantenuto. Se non sort
prima il file non credo uniq
può funzionare correttamente.
Come posso rimuovere i duplicati nella mia .bash_history, mantenendo l'ordine?
Credito extra:
Ci sono problemi con la sovrascrittura di .bash_history
file tramite uno script? Ad esempio, se rimuovi un file di registro apache penso che tu debba inviare un segnale nohup/reset con kill
per farlo svuotare è la connessione al file. Se questo è il caso di .bash_history
file, forse potrei in qualche modo usare ps
per controllare e assicurarsi che non ci siano sessioni connesse prima dell'esecuzione dello script di filtraggio?
Risposta accettata:
Ordinamento della cronologia
Questo comando funziona come sort|uniq
, ma mantiene le linee in posizione
nl|sort -k 2|uniq -f 1|sort -n|cut -f 2
Fondamentalmente, antepone ad ogni riga il suo numero. Dopo sort|uniq
-ing, tutte le righe vengono riordinate in base al loro ordine originale (utilizzando il campo del numero di riga) e il campo del numero di riga viene rimosso dalle righe.
Questa soluzione ha il difetto che non è definito quale rappresentante di una classe di linee uguali lo farà nell'output e quindi la sua posizione nell'output finale è indefinita. Tuttavia, se dovesse essere scelto l'ultimo rappresentante, puoi sort
l'input da un secondo tasto:
nl|sort -k2 -k 1,1nr|uniq -f1|sort -n|cut -f2
Gestione di .bash_history
Per rileggere e riscrivere la cronologia, puoi utilizzare history -a
e history -w
rispettivamente.