J'aime vraiment utiliser control+r
pour rechercher de manière récursive 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
seulement les doublons séquentiels ne sont effacés - de sorte qu'avec cette chaîne de commandes:
ls
cd ~
ls
La ls
commande sera effectivement 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 préservé. Si je ne sort
commence pas par le fichier, je ne crois pas que cela uniq
puisse fonctionner correctement.
Comment puis-je supprimer les doublons dans mon .bash_history, en préservant l'ordre?
Crédit supplémentaire:
Existe-t-il des problèmes pour écraser le .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 le vider de sa connexion au fichier. Si tel est le cas avec le .bash_history
fichier, je pourrais peut-être utiliser d'une manière ou d'une autre ps
pour vérifier et s'assurer qu'il n'y a pas de session connectée avant l'exécution du script de filtrage?
ignoredups
plutôterasedups
pendant un moment et voyez comment cela fonctionne pour vous.history
commande. Où devrais-je chercher?Réponses:
Tri de l'histoire
Cette commande fonctionne comme
sort|uniq
, mais garde les lignes en placeFondamentalement, chaque ligne est préfixée par son numéro. Ensuite
sort|uniq
, toutes les lignes sont triées selon leur ordre d'origine (à l'aide du champ numéro de ligne) et le champ numéro de ligne est supprimé des lignes.Cette solution a le défaut de ne pas définir quel représentant d'une classe de lignes égales le fera dans la sortie et, par conséquent, sa position dans la sortie finale n'est pas définie. Toutefois, si le dernier représentant devait être choisi, vous pouvez
sort
saisir une seconde clé:Gérer .bash_history
Pour relire et réécrire l'historique, vous pouvez utiliser
history -a
ethistory -w
respectivement.la source
sort
, le-r
commutateur inverse toujours l'ordre de tri. Mais cela ne donnera pas le résultat escompté.sort
considère les deux occurrences dels
comme identiques avec le résultat que, même inversé, l'ordre éventuel dépend de l'algorithme de tri. Mais voir ma mise à jour pour une autre idée.nl
au début de chaque ligne de code? Ça ne devrait pas être çahistory
?Donc, je cherchais exactement la même chose après avoir été ennuyé par les doublons, et je me suis rendu compte que si je modifiais mon ~ / .bash_profile (Mac) avec:
Il fait exactement ce que vous vouliez, il ne garde que la dernière de toutes les commandes.
ignoreboth
est en fait juste comme faireignorespace:ignoredups
et cela avecerasedups
fait le travail fait.Au moins sur mon terminal Mac avec bash, ce travail est parfait. Trouvé ici sur askubuntu.com .
la source
Trouvé cette solution à l'état sauvage et testé:
La première fois qu'une valeur spécifique d'une ligne ($ 0) est vue, la valeur de x [$ 0] est zéro.
La valeur de zéro est inversée avec
!
et devient un.Une instruction évaluée à un provoque l'action par défaut, à savoir imprimer.
Par conséquent, la première fois qu'un élément spécifique
$0
est vu, il est imprimé.A chaque fois (les répétitions) la valeur de
x[$0]
a été incrémentée,sa valeur inversée est zéro et une instruction évaluée à zéro ne s'imprime pas.
Pour conserver la dernière valeur répétée, inversez l’historique et utilisez le même awk:
la source
Prolonger la réponse de Clayton:
tac
inverser le fichier, assurez-vous que vous avez installémoreutils
afin que vous avezsponge
disponible, sinon utilisez un fichier temporaire.la source
brew install coreutils
et notez que tous les utilitaires GNU ont étég
préfabriqués pour éviter toute confusion avec les commandes Mac intégrées de BSD (par exemple, gsed est GNU alors que sed est BSD). Alors utilisezgtac
.Ceux-ci garderaient les dernières lignes dupliquées:
la source
Ceci est un vieux message, mais un problème perpétuel pour les utilisateurs qui souhaitent avoir plusieurs terminaux ouverts et dont l'historique doit être synchronisé entre les fenêtres, mais non dupliqué.
Ma solution dans .bashrc:
history -n
lit toutes les lignes de $ HISTFILE susceptibles de s’être produites dans un terminal différent depuis le dernier retour chariothistory -w
écrit le tampon mis à jour dans $ HISTFILEhistory -c
efface le tampon pour éviter toute duplicationhistory -r
relit le $ HISTFILE, en ajoutant au tampon maintenant videtac
l'inverse, puis l'inverse afin qu'il puisse être enregistré avec les commandes les plus récentes encore les plus récentes de l'historiqueChaque fois que vous ouvrez un nouveau shell, l'historique a toutes les dupes effacées, et chaque fois que vous appuyez sur la Entertouche dans une fenêtre shell / terminal différente, il met à jour cet historique à partir du fichier.
la source
Enregistrer uniformément chaque nouvelle commande est délicat. Tout d'abord, vous devez ajouter
~/.profile
ou similaire:Ensuite, vous devez ajouter à
~/.bash_logout
:la source