Ver uma série de histórico do bash

30

O historycomando lista todo o histórico da sessão atual. Gostar:

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

A fim de procurar itens de interesse, eu posso tubo historycom grepcomo

history | grep ls
1 ls
6 ls
10 ls

Também posso ver os três últimos comandos, como:

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

Mas como obtenho um intervalo específico da história? Por exemplo, algo como:

history range 4 7
4 cd something
5 touch afile
6 ls
7 cd ..
Slartibartfast
fonte
Você pode listar os últimos xcomandos e canalizar para head.
Bratchley
@Bratchley: Para isso, eu teria que saber quantos últimos comandos ir. Considere isso: meus history | grep somethingresultados são mostrados nos comandos numerados 123 234 345no histórico e talvez eu não saiba o número do último comando executado ( historyneste caso). Meu último comando pode ser numerado 400, 500 ou o que for. Então, primeiro eu tenho que verificar esse número, descobrir a diferença, a lista dos últimos xcomandos e tubulação entãohead
Slartibartfast

Respostas:

52

Em vez de history, você pode usar o fcque permite selecionar o intervalo:

fc -l 4 7
cuonglm
fonte
4
Ele ainda aceita números negativos para contar a partir do final, como fc -l -16 -10.
Franklin Yu
hmm, pergunto-me por que precisamos de um comando totalmente novo em vez de apenas argumentos para o comando real ...
Ringo
10

Se você deve usar o comando history, passe-o através do sed ou do awk:

history | sed -n '10,20p'

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

Caso contrário, a resposta do cuonglm é a melhor opção.

G.Gabunia
fonte
6
Como estamos em más alternativas, uma combinação heade tailresolveria esse problema de uma maneira ainda menos elegante. Para o intervalo de 10 a 25, você teria que usar history | head 25 | tail 15.
Aaron
1

Usar o histórico com um grep nos números das linhas em torno do comando que estou procurando funciona melhor para mim.

Por exemplo, estou procurando o que fiz por aí ping mybox, mais ou menos 20 linhas.

$ history | grep "ping mybox" 20325 ping mybox

Essa é a linha, 20325então só tenho que cumprimentar as linhas começando por um número no [20320..20339]intervalo.

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

Luc Yriarte
fonte
(1) Você diz "mais ou menos 20", mas seu exemplo mostra −5 e +14. (2) Isso não funciona para mim, porque os números da história parecem ter espaços iniciais.
Scott