J'aime vraiment utiliser control+r
pour rechercher récursivement mon historique de commandes. J'ai trouvé quelques bonnes options que j'aime utiliser avec :
# 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
Le seul problème pour moi est que erasedups
efface uniquement les doublons séquentiels - de sorte qu'avec cette chaîne de commandes :
ls
cd ~
ls
Le ls
commande sera en fait enregistrée deux fois. J'ai pensé à exécuter périodiquement w/ cron :
cat .bash_history | sort | uniq > temp.txt
mv temp.txt .bash_history
Cela permettrait de supprimer les doublons, mais malheureusement l'ordre ne serait pas conservé. Si je ne fais pas de sort
le fichier d'abord je ne crois pas uniq
peut fonctionner correctement.
Comment puis-je supprimer les doublons dans mon .bash_history, en préservant l'ordre ?
Crédit supplémentaire :
Y a-t-il des problèmes avec l'écrasement du .bash_history
fichier via un script? Par exemple, si vous supprimez un fichier journal apache, je pense que vous devez envoyer un signal nohup / reset avec kill
pour qu'il vide sa connexion au fichier. Si tel est le cas avec le .bash_history
fichier, je pourrais peut-être utiliser ps
vérifier et s'assurer qu'il n'y a pas de sessions connectées avant l'exécution du script de filtrage ?
Réponse acceptée :
Trier l'historique
Cette commande fonctionne comme sort|uniq
, mais maintient les lignes en place
nl|sort -k 2|uniq -f 1|sort -n|cut -f 2
Fondamentalement, ajoute à chaque ligne son numéro. Après sort|uniq
-ing, toutes les lignes sont triées selon leur ordre d'origine (en utilisant le champ de numéro de ligne) et le champ de numéro de ligne est supprimé des lignes.
Cette solution a le défaut qu'il n'est pas défini quel représentant d'une classe de lignes égales le fera dans la sortie et donc sa position dans la sortie finale est indéfinie. Cependant, si le dernier représentant doit être choisi, vous pouvez sort
la saisie par une seconde touche :
nl|sort -k2 -k 1,1nr|uniq -f1|sort -n|cut -f2
Gérer .bash_history
Pour relire et réécrire l'historique, vous pouvez utiliser history -a
et history -w
respectivement.