Zeigen Sie einen Bereich des Bash-Verlaufs an

30

Der historyBefehl listet den gesamten Verlauf für die aktuelle Sitzung auf. Mögen:

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

Um Elemente von Interesse suchen, kann ich Rohr historymit grepwie

history | grep ls
1 ls
6 ls
10 ls

Ich kann auch die letzten 3 Befehle anzeigen wie:

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

Aber wie komme ich zu einem bestimmten Bereich der Geschichte? Zum Beispiel so etwas wie:

history range 4 7
4 cd something
5 touch afile
6 ls
7 cd ..
Slartibartfast
quelle
Sie könnten die letzten xBefehle auflisten und dann weiterleiten head.
Bratchley
@Bratchley: Dazu müsste ich wissen, zu wie vielen letzten Befehlen ich gehen muss. Berücksichtigen Sie dies, meine history | grep somethingzeigt Ergebnisse von Befehlen, die 123 234 345im Verlauf nummeriert sind, und ich kenne möglicherweise nicht die Nummer des zuletzt ausgeführten Befehls ( historyin diesem Fall). Mein letzter Befehl könnte 400, 500 oder was auch immer sein. Also muss ich zuerst diese Nummer überprüfen, den Unterschied herausfinden, die letzten xBefehle auflisten und dann head
Slartibartfast

Antworten:

52

Stattdessen historykönnen Sie verwenden fc, mit denen Sie den Bereich auswählen können:

fc -l 4 7
cuonglm
quelle
4
Es akzeptiert sogar negative Zahlen, um vom Ende an zu zählen fc -l -16 -10.
Franklin Yu
hmm, ich frage mich, warum wir einen ganz neuen Befehl brauchen, anstatt nur Argumente für den tatsächlichen Befehl ...
Ringo
10

Wenn Sie den Befehl history verwenden müssen , leiten Sie ihn durch sed oder awk:

history | sed -n '10,20p'

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

Andernfalls ist die Antwort von cuonglm die bessere Option.

G.Gabunia
quelle
6
Da wir schlechte Alternativen mögen, würde eine Kombination von headund taildieses Problem auf eine noch weniger elegante Weise lösen. Für den Bereich 10 -> 25 müssten Sie verwenden history | head 25 | tail 15.
Aaron
1

Die Verwendung von history mit einem Grep in den Zeilennummern um den gesuchten Befehl funktioniert am besten für mich.

Zum Beispiel suche ich nach dem, was ich gemacht habe, ungefähr ping mybox20 Zeilen.

$ history | grep "ping mybox" 20325 ping mybox

Das ist die Zeile, 20325also muss ich die Zeilen nur mit einer Zahl im [20320..20339]Bereich beginnen.

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

Luc Yriarte
quelle
(1) Sie sagen "mehr oder weniger 20", aber Ihr Beispiel zeigt -5 und +14. (2) Dies funktioniert bei mir nicht, da Verlaufsnummern führende Leerzeichen zu haben scheinen.
Scott