GNU/Linux >> Tutoriels Linux >  >> Linux

Comment supprimer les doublons dans le .bash_history, en préservant l'ordre ?

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.

En relation :Exécuter des scripts bash en entrant dans un répertoire ?
Linux
  1. Comment supprimer un utilisateur sous Linux à l'aide de la ligne de commande

  2. Comment supprimer une seule ligne de l'historique ?

  3. Comment supprimer le mot de passe de votre clé SSL

  4. Comment supprimer le gestionnaire de cache cPanel

  5. Comment le noyau Linux détermine-t-il l'ordre des appels __init ?

Comment supprimer les doublons dans LibreOffice

Comment supprimer les raccourcis sur Google Chrome

Comment effacer l'historique sur Google Chrome

Comment utiliser la commande history sur CentOS 8

Comment supprimer une commande de l'historique sous Linux

Comment utiliser "l'historique Yum" pour découvrir les packages installés ou supprimés