Visualizza una gamma di cronologia bash


30

Il historycomando elenca tutta la cronologia per la sessione corrente. Piace:

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

Per cercare elementi di interesse, posso eseguire pipe historycon greplike

history | grep ls
1 ls
6 ls
10 ls

Posso anche visualizzare gli ultimi 3 comandi come:

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

Ma come posso ottenere un intervallo specifico di storia? Ad esempio qualcosa del tipo:

history range 4 7
4 cd something
5 touch afile
6 ls
7 cd ..

È possibile elencare gli ultimi xcomandi, quindi reindirizzare head.
Bratchley,

@Bratchley: per questo dovrei sapere a quanti ultimi comandi devo andare. Considera questo, il mio history | grep somethingmostra i risultati dei comandi numerati 123 234 345nella cronologia e potrei non conoscere il numero dell'ultimo comando eseguito ( historyin questo caso). Il mio ultimo comando potrebbe essere il numero 400, 500 o qualsiasi altra cosa. Quindi prima devo controllare quel numero, capire la differenza, elencare gli ultimi xcomandi e poi reindirizzare ahead
Slartibartfast

Risposte:


52

Invece di history, è possibile utilizzare fc, che consente di selezionare l'intervallo:

fc -l 4 7

4
Accetta anche numeri negativi da contare alla fine, come fc -l -16 -10.
Franklin Yu,

hmm, mi chiedo perché abbiamo bisogno di un comando completamente nuovo anziché solo argomenti per il comando effettivo ...
Ringo

10

Se devi usare il comando history, esegui il pipe attraverso sed o awk:

history | sed -n '10,20p'

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

Altrimenti la risposta di cuonglm è l'opzione migliore.


6
Dal momento che siamo in cattive alternative, una combinazione di heade tailrisolverebbe questo problema in un modo ancora meno elegante. Per l'intervallo 10-> 25 dovresti usare history | head 25 | tail 15.
Aaron,

1

Utilizzando la cronologia con un grep sui numeri di riga attorno al comando che sto cercando funziona meglio per me.

Ad esempio, sto cercando ciò che ho fatto in giro ping mybox, più o meno 20 righe.

$ history | grep "ping mybox" 20325 ping mybox

Questa è la linea, 20325quindi devo solo grep le linee che iniziano con un numero [20320..20339]nell'intervallo.

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


(1) Dici “più o meno 20”, ma il tuo esempio mostra −5 e +14. (2) Questo non funziona per me, perché i numeri storici sembrano avere spazi iniziali.
Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.