GNU/Linux >> Linux Esercitazione >  >> Linux

Come rimuovere i duplicati in .bash_history, mantenendo l'ordine?

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.

Correlati:eseguire gli script bash entrando in una directory?
Linux
  1. Come rimuovere l'utente in Linux utilizzando la riga di comando

  2. Come rimuovere una singola riga dalla cronologia?

  3. Come rimuovere il gestore della cache di cPanel

  4. Come puoi rimuovere i duplicati dalla cronologia di bash?

  5. Come rimuovo il dispositivo cache da bcache?

Come rimuovere i duplicati in LibreOffice

Come rimuovere i collegamenti su Google Chrome

Come cancellare la cronologia su Google Chrome

Come utilizzare il comando cronologia su CentOS 8

Come rimuovere un comando dalla cronologia in Linux

Come utilizzare "Yum history" per scoprire pacchetti installati o rimossi