Historique Bash sans numéros de ligne

129

La historycommande bash est très cool. Je comprends pourquoi il affiche les numéros de ligne, mais existe-t-il un moyen d'appeler la commande d'historique et de supprimer les numéros de ligne?

Le but ici est d'utiliser la commande d'historique, alors ne répondez pas cat ~/.bash_history

Sortie courant:

  529 man history
  530 ls
  531 ll
  532 clear
  533 cd ~
  534 history

Source graphique historique.

Sortie désirée:

man history
ls
ll
clear
cd ~
history

Source graphique historique.

Merci à tous pour vos excellentes solutions. Paul's est le plus simple et fonctionnera pour moi car la taille de mon historique de bash est fixée à 2000.

Je voulais aussi partager un article sympa que j'ai trouvé ce matin. Il a quelques bonnes options que j'utilise maintenant, comme garder les entrées en double hors de l'historique bash et m'assurer que plusieurs sessions bash n'écrasent pas le fichier historique: http://blog.macromates.com/2008/working-with -histoire-en-bash /

cwd
la source
Puis-je demander pourquoi cat ~/.bash_historyest exclu?
flow2k

Réponses:

204

Essaye ça:

$ history | cut -c 8-
Paul R
la source
Pouvons-nous diriger la sortie de la historycommande au lieu de lire le fichier?
cwd
Semble fonctionner! Pouvez-vous expliquer ce qu'il fait? Cela fonctionnera-t-il si les nombres vont de 1 à 10 000?
cwd
29
man cut. Il supprime les 7 premiers caractères de chaque ligne de sortie de la historycommande. Il ne devrait avoir de problèmes que si le nombre dépasse 99 999, ce que je n'ai jamais vu (et j'utilise beaucoup les shells ). Mais si cela vous inquiète:history | sed 's/^ *[0-9]* *//'
Keith Thompson
1
Je pense que la solution de @Paul R est ce dont j'ai besoin. Je n'avais pas réalisé au début que la commande d'historique remplissait les numéros de ligne avec des espaces et maintenant la cutsyntaxe a plus de sens :) Merci @Keith Thompson pour votre solution qui fonctionnera pour> 100k d'histoires.
cwd
5
@cwd: Si vous avez 100 000 commandes dans votre historique, il est temps de vous éloigner du clavier et de rentrer chez vous. Si vous êtes déjà chez vous, sortez. 8-)} (Oui, je sais que l'histoire peut être conservée à travers les sessions.)
Keith Thompson
22

awk peut aider:

history|awk '{$1="";print substr($0,2)}'

Cette réponse peut échouer si vous avez une longue histoire.

Zsolt Botykai
la source
Ha Ha, merci - substrc'est tellement plus simple, j'utilise history | awk '{for (i=2;i<=NF;i++) printf("%s ", $i);print("\r")}'pour le mien !!
geedoubleya
17

Je suis tout à fait conscient que cette question est pour bash et beaucoup de gens préféreraient ne pas passer à zsh (cue downvotes ...)

Cependant, si vous étiez prêt à passer à zsh, zsh le prend en charge nativement (ainsi que d'autres options pour le formatage de l'historique)

zsh> fc -ln 0

(Voir /server/114988/removing-history-or-line-numbers-from-zsh-history-file )

Att Righ
la source
7
En fait, fcc'est aussi un bashbuiltin. La seule différence est que la première ligne est 1, donc ce seraitfc -ln 1
wisbucky
//, Ayez un vote positif pour le fait que je ne savais même pas qu'il y avait des alternatives à Bash pendant très longtemps jusqu'à ce que quelqu'un les évoque dans un contexte comme celui-ci.
Nathan Basanese
11

Je suis en retard sur celui-ci, mais la méthode la plus courte serait d'ajouter ce qui suit dans votre fichier ~/.bashrcou ~/.profile:

HISTTIMEFORMAT="$(echo -e '\r\e[K')"

De bash manpage:

       HISTTIMEFORMAT
              Si cette variable est définie et non nulle, sa valeur est utilisée comme
              chaîne de format pour strftime (3) pour imprimer l'horodatage associé
              avec chaque entrée d'historique affichée par l'historique intégré. Si
              cette variable est définie, les horodatages sont écrits dans l'historique
              fichier afin qu'ils puissent être préservés à travers les sessions shell. Cela utilise
              le caractère de commentaire d'historique pour distinguer les horodatages de
              d'autres lignes d'histoire.

En utilisant cette capacité, un smart hack consiste à faire de la variable "print" un retour chariot ( \r) et d'effacer la ligne (code ANSI K) au lieu d'un horodatage réel.

iMil
la source
Un peu plus simple, en utilisant une syntaxe plus obscure:HISTTIMEFORMAT=$'\r\e[K'
wjandrea
5
Et une option sur une ligne:HISTTIMEFORMAT=$'\r\e[K' history
wjandrea
5

Vous pouvez également utiliser sed:

history | sed 's/^[ ]*[0-9]\+[ ]*//'

En utilisant un alias, vous pouvez définir ceci comme votre standard (collez-le dans votre bash_profile):

alias history="history | sed 's/^[ ]*[0-9]\+[ ]*//'"
Manny D
la source
1
\+dans une expression régulière de base n'est pas conforme à POSIX. À utiliser \{1,\}si votre sedne prend pas en charge l' \+extension non standard .
Richard Hansen
4

Bien que couper avec l' -coption fonctionne dans la plupart des cas pratiques, je pense que la connexion de l'historique à awk serait une meilleure solution. Par exemple:

history | awk '{ $1=""; print }'

OU

history | awk '{ $1=""; print $0 }'

Ces deux solutions font la même chose. La sortie de l'histoire est envoyée à awk. Awk efface ensuite la première colonne, qui correspond aux nombres dans la sortie de la commande d'historique. Ici awk est plus pratique car vous n'avez pas à vous soucier du nombre de caractères dans la partie numérique de la sortie.

print $0équivaut à print, puisque la valeur par défaut est d'imprimer tout ce qui apparaît sur la ligne. La saisie print $0est plus explicite, mais celle que vous choisissez dépend de vous. Le comportement de print $0et simplement printlorsqu'il est utilisé avec awk est plus évident si vous utilisez awk pour imprimer un fichier (ce catserait plus rapide à taper au lieu de awk, mais c'est pour illustrer un point).

[Ex] Utilisation de awk pour afficher le contenu d'un fichier avec $ 0

$ awk '{print $0}' /tmp/hello-world.txt
Hello World!

[Ex] Utilisation de awk pour afficher le contenu d'un fichier sans $ 0 explicite

$ awk '{print}' /tmp/hello-world.txt
Hello World!

[Ex] Utilisation de awk lorsque la ligne d'historique s'étend sur plusieurs lignes

$ history
   11  clear
   12  echo "In word processing and desktop publishing, a hard return or paragraph break indicates a new paragraph, to be distinguished from the soft return at the end of a line internal to a paragraph. This distinction allows word wrap to automatically re-flow text as it is edited, without losing paragraph breaks. The software may apply vertical whitespace or indenting at paragraph breaks, depending on the selected style."

$ history | awk ' $1=""; {print}'
 clear
 echo "In word processing and desktop publishing, a hard return or paragraph break indicates a new paragraph, to be distinguished from the soft return at the end of a line internal to a paragraph. This distinction allows word wrap to automatically re-flow text as it is edited, without losing paragraph breaks. The software may apply vertical whitespace or indenting at paragraph breaks, depending on the selected style."
Suave-V
la source
4
history -w /dev/stdout

De la sortie de history --help:

-w écrit l'historique actuel dans le fichier historique

Il écrit l'historique actuel dans le fichier spécifié - /dev/stdoutdans ce cas.

Czerny
la source
3

historyLa commande n'a pas d'option pour supprimer les numéros de ligne. Vous devrez combiner plusieurs commandes comme tout le monde le suggère:

Exemple :

history | cut -d' ' -f4- | sed 's/^ \(.*$\)/\1/g'
porteur de l'anneau
la source
3
Si vous voulez l'exécuter de sedtoute façon, la coupe initiale est redondante - ajoutez-la simplement à l'expression à la place.
moopet
2
$ hh -n

Vous voudrez peut-être essayer https://github.com/dvorka/hstr qui permet un filtrage "de style boîte de suggestion" de l'historique de Bash avec un classement (facultatif) basé sur les métriques, c'est-à-dire qu'il est beaucoup plus efficace et plus rapide dans les deux sens:

entrez la description de l'image ici

Il peut être facilement lié à Ctrl-ret / ouCtrl-s

Martin Dvorak
la source
1

Vous pouvez utiliser la commande cutpour le résoudre:

Découpez les champs de STDIN ou de fichiers.

  • Découpez les seize premiers caractères de chaque ligne de STDIN: cut -c 1-16

  • Découpez les seize premiers caractères de chaque ligne des fichiers donnés: cut -c 1-16 file

  • Découpez tout du 3ème caractère à la fin de chaque ligne: cut -c3-

  • Découpez le cinquième champ de chaque ligne, en utilisant un deux-points comme délimiteur de champ (le délimiteur par défaut est tabulation): cut -d':' -f5

  • Découpez les 2e et 10e champs de chaque ligne, en utilisant un point-virgule comme délimiteur: cut -d';' -f2,10

  • Découpez les champs 3 à 7 de chaque ligne, en utilisant un espace comme délimiteur: cut -d' ' -f3-7

GEOKING
la source
0

Je sais que je suis en retard pour la fête mais c'est tellement plus facile à retenir:

cat ~/.bash_history
Mike Slinn
la source
C'est vrai, mais la deuxième ligne de l'OP: "Le but ici est d'utiliser la commande history, donc s'il vous plaît ne répondez pas cat ~ / .bash_history"
Cireo