Ver un rango de historial de bash

30

El historycomando enumera todo el historial de la sesión actual. Me gusta:

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

Para buscar elementos de interés, puedo canalizar historycon me grepgusta

history | grep ls
1 ls
6 ls
10 ls

También puedo ver los últimos 3 comandos como:

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

Pero, ¿cómo obtengo un rango específico de historia? Por ejemplo algo como:

history range 4 7
4 cd something
5 touch afile
6 ls
7 cd ..
Slartibartfast
fuente
Puede enumerar los últimos xcomandos y luego canalizarlos head.
Bratchley
@Bratchley: Para eso tendría que saber a cuántos últimos comandos ir. Considere esto, mi history | grep somethingmuestra los resultados de los comandos numerados 123 234 345en el historial y es posible que no sepa el número del último comando ejecutado ( historyen este caso). Mi último comando podría estar numerado 400, 500 o lo que sea. Así que primero tengo que comprobar ese número, figura la diferencia, la lista de los últimos xcomandos y luego a la tuberíahead
Slartibartfast

Respuestas:

52

En lugar de history, puede usar fc, que le permiten seleccionar el rango:

fc -l 4 7
Cuonglm
fuente
44
Incluso acepta números negativos para contar desde el final, como fc -l -16 -10.
Franklin Yu
hmm, me pregunto por qué necesitamos un comando completamente nuevo en lugar de solo argumentos para el comando real ...
Ringo
10

Si debe usar el comando de historial, póngalo a través de sed o awk:

history | sed -n '10,20p'

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

De lo contrario, la respuesta de cuonglm es una mejor opción.

G.Gabunia
fuente
66
Como estamos en malas alternativas, una combinación de heady tailresolvería este problema de una manera aún menos elegante. Para el rango 10-> 25 tendrías que usar history | head 25 | tail 15.
Aaron
1

Usar el historial con un grep en los números de línea alrededor del comando que estoy buscando funciona mejor para mí.

Por ejemplo, estoy buscando lo que hice alrededor ping mybox, más o menos 20 líneas.

$ history | grep "ping mybox" 20325 ping mybox

Esa es la línea, 20325así que solo tengo que seleccionar las líneas comenzando por un número en el [20320..20339]rango.

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

Luc Yriarte
fuente
(1) Dices "más o menos 20", pero tu ejemplo muestra −5 y +14. (2) Esto no funciona para mí, porque los números de la historia parecen tener espacios iniciales.
Scott