Afficher une gamme d'historique bash

30

La historycommande répertorie tout l'historique de la session en cours. Comme:

1 ls 
2 cd /root
3 mkdir something
4 cd something
5 touch afile
6 ls
7 cd ..
8 rm something/afile
9 cd ..
10 ls
11 history

Pour rechercher des éléments d'intérêt, je peux tuyau historyavec grepcomme

history | grep ls
1 ls
6 ls
10 ls

Je peux également voir les 3 dernières commandes comme:

history 3
11 history
12 history | grep ls
13 history 3

Mais comment puis-je obtenir un historique spécifique? Par exemple quelque chose comme:

history range 4 7
4 cd something
5 touch afile
6 ls
7 cd ..
Slartibartfast
la source
Vous pouvez lister les dernières xcommandes, puis rediriger vers head.
Bratchley
@Bratchley: Pour cela, je devrais savoir à combien de dernières commandes aller. Considérez ceci, mon history | grep somethingaffiche les résultats des commandes numérotées 123 234 345dans l'historique et je ne connais peut-être pas le numéro de la dernière commande exécutée ( historydans ce cas). Ma dernière commande pourrait être numérotée 400, 500 ou autre. Donc, je dois d'abord vérifier ce nombre, comprendre la différence, répertorier les dernières xcommandes, puis diriger vershead
Slartibartfast

Réponses:

52

Au lieu de history, vous pouvez utiliser fcce qui vous permet de sélectionner une plage:

fc -l 4 7
cuonglm
la source
4
Il accepte même les nombres négatifs pour compter à partir de la fin, comme fc -l -16 -10.
Franklin Yu
hmm, je me demande pourquoi nous avons besoin d'une toute nouvelle commande au lieu de simplement des arguments à la commande réelle ...
Ringo
10

Si vous devez utiliser la commande history, dirigez-la via sed ou awk:

history | sed -n '10,20p'

history | awk 'NR >= 10 && NR <= 20'

Sinon, la réponse de cuonglm est une meilleure option.

G.Gabunia
la source
6
Puisque nous sommes dans de mauvaises alternatives, une combinaison de headet tailrésoudrait ce problème d'une manière encore moins élégante. Pour la plage 10-> 25, vous devez utiliser history | head 25 | tail 15.
Aaron
1

L'utilisation de l'historique avec un grep sur les numéros de ligne autour de la commande que je recherche fonctionne le mieux pour moi.

Par exemple, je cherche ce que j'ai fait autour ping mybox, plus ou moins 20 lignes.

$ history | grep "ping mybox" 20325 ping mybox

C'est la ligne, 20325donc je dois juste grep les lignes commençant par un nombre dans la [20320..20339]plage.

$ history | grep ^203[2-3][0-9]

Luc Yriarte
la source
(1) Vous dites «plus ou moins 20», mais votre exemple montre −5 et +14. (2) Cela ne fonctionne pas pour moi, car les chiffres de l'histoire semblent avoir des espaces en tête.
Scott