Zobacz całą historię bash

30

W historylistuje wszystkie historia dla bieżącej sesji. Lubić:

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

Aby wyszukać interesujące przedmioty, mogę używać fajki historyz greppodobnymi

history | grep ls
1 ls
6 ls
10 ls

Mogę również wyświetlić 3 ostatnie polecenia, takie jak:

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

Ale jak uzyskać konkretny zakres historii? Na przykład coś takiego:

history range 4 7
4 cd something
5 touch afile
6 ls
7 cd ..
Slartibartfast
źródło
Możesz wymienić ostatnie xpolecenia, a następnie potokować do head.
Bratchley,
@Bratchley: W tym celu musiałbym wiedzieć, do ilu ostatnich poleceń należy przejść. Zastanów się nad tym, moje history | grep somethingwyniki pokazują polecenia ponumerowane 123 234 345w historii i mogę nie znać liczby ostatnio wykonanych poleceń ( historyw tym przypadku). Moje ostatnie polecenie może mieć numer 400, 500 lub cokolwiek innego. Więc najpierw muszę sprawdzić ten numer, ustalić różnicę, wymienić ostatnie xpolecenia, a następnie przesłać dohead
Slartibartfast

Odpowiedzi:

52

Zamiast tego historymożesz użyć fc, które pozwalają wybrać zakres:

fc -l 4 7
Cuonglm
źródło
4
Akceptuje nawet liczby ujemne, aby liczyć od końca, jak fc -l -16 -10.
Franklin Yu,
hmm, zastanawiam się, dlaczego potrzebujemy zupełnie nowego polecenia zamiast tylko argumentów do rzeczywistego polecenia ...
Ringo
10

Jeśli musisz użyć polecenia historii, przeprowadź go przez sed lub awk:

history | sed -n '10,20p'

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

W przeciwnym razie odpowiedź cuonglm jest lepszą opcją.

G.Gabunia
źródło
6
Ponieważ mamy złe alternatywy, połączenie headi tailrozwiązałoby ten problem w jeszcze mniej elegancki sposób. W przypadku zakresu 10–> 25 należy użyć history | head 25 | tail 15.
Aaron
1

Używanie historii z grep na numerach wierszy wokół polecenia, którego szukam, działa najlepiej dla mnie.

Na przykład szukam tego, co zrobiłem ping mybox, mniej więcej 20 linii.

$ history | grep "ping mybox" 20325 ping mybox

To jest linia, 20325więc muszę po prostu wstawić linie zaczynające się od liczby z [20320..20339]zakresu.

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

Luc Yriarte
źródło
(1) Mówisz „mniej więcej 20”, ale twój przykład pokazuje -5 i +14. (2) To nie działa dla mnie, ponieważ liczby historyczne wydają się mieć wiodące spacje.
Scott,