Zeigen Sie einen Bereich des Bash-Verlaufs an

Zeigen Sie einen Bereich des Bash-Verlaufs an

Der historyBefehl listet den gesamten Verlauf der aktuellen Sitzung auf. Wie:

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 nach interessanten Elementen zu suchen, kann ich historymit greplike pipen

history | grep ls
1 ls
6 ls
10 ls

Ich kann auch die letzten drei Befehle anzeigen, wie:

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

Aber wie erhalte ich einen bestimmten Verlaufsbereich? Zum Beispiel so etwas wie:

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

Antwort1

Anstelle von historykönnen Sie verwendenfc, mit denen Sie einen Bereich auswählen können:

fc -l 4 7

Antwort2

Wenn dumussVerwenden Sie den Verlaufsbefehl und leiten Sie ihn durch sed oder awk weiter:

history | sed -n '10,20p'

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

Ansonsten ist die Antwort von cuonglm die bessere Option.

Antwort3

Die Nutzung der Geschichte mit einemgrep auf den Zeilennummernum den gesuchten Befehl herum funktioniert für mich am besten.

Ich suche zum Beispiel nach dem, was ich gemacht habe ping mybox, ungefähr 20 Zeilen.

$ history | grep "ping mybox" 20325 ping mybox

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

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

Antwort4

Wenn Sie „history“ verwenden müssen, ist dies eine korrektere, auf Sed basierende Version für die Verlaufszeilen 4–7:

history | sed '/^4 /,/^7 /!d;/^7 /q'

Dies spiegelt die Absicht des ursprünglichen Verfassers wider, die n-te Zeile des Verlaufs zu drucken, nicht die n-te Zeile der Ausgabe des Verlaufsbefehls. Fast immer werden die beiden nicht gleich sein. Zum Beispiel die Zahlen, die den Verfasser in dieser Verlaufsausgabe interessieren:

... 20 preceding lines.
12134 ls dataDir
12135 ls myDir
12136 ls something
... some more lines

sind 12134,12135,12136 und nicht 21,22,23, und der sed-Befehl sollte das erfassen, in diesem Fall etwa so:

history | sed '/^12134 /,/^12135 /!d;/^12135 /q'

Das spezifische Format für die Zahlen:

'/^n[space]/'

erfasst die Absicht, dass die Zahl am Anfang der Zeile steht und dass ihr ein Leerzeichen folgt. (Wenn ich mir das ansehe, denke ich, dass das Leerzeichen unnötig ist, aber es beruhigt mich, ha.)

Und ja, wie @G.Gabunia oben sagt, ist FC einfacher

verwandte Informationen