Następują polecenia
511 clear
512 history
513 history -d 505
514 history
515 history -d 507 510 513
516 history
517 history -d 509
518 history
519 history -d 511
520 history
Mogę usunąć pojedyncze przez history -d 511
, ale jak usunąć ostatnie 10 poleceń i między 10 historią poleceń za pomocą pojedynczego polecenia w powłoce?
Czy możemy napisać skrypt bash i wykonać go w celu usunięcia historii?
vi $HISTFILE
i usuń to, co chcesz. Użyj,head -n -10
jeśli musisz to zautomatyzować.Odpowiedzi:
Czy próbowałeś edytować plik historii bezpośrednio:
źródło
~/.viminfo
więc pamiętaj, aby ją usunąć!.bash_history
mogą zostać nadpisane przez to, co jest w pamięci. To rozwiązanie okazało się pomocne: superuser.com/a/384383/253543Moja odpowiedź jest oparta na poprzednich odpowiedziach, ale z dodatkiem odwrócenia kolejności, tak aby pozycje historii były usuwane od najnowszych do najświeższych.
Pobierz swoją aktualną historię (dostosuj liczbę wierszy, które chcesz zobaczyć):
history | tail -n 10
To daje mi coś takiego
1003 25-04-2016 17:54:52 echo "Command 1" 1004 25-04-2016 17:54:54 echo "Command 2" 1005 25-04-2016 17:54:57 echo "Command 3" 1006 25-04-2016 17:54:59 echo "Command 4" 1007 25-04-2016 17:55:01 echo "Command 5" 1008 25-04-2016 17:55:03 echo "Command 6" 1009 25-04-2016 17:55:07 echo "Command 7" 1010 25-04-2016 17:55:09 echo "Command 8" 1011 25-04-2016 17:55:11 echo "Command 9" 1012 25-04-2016 17:55:14 echo "Command 10"
Wybierz pozycję początkową i końcową dla elementów, które chcesz usunąć. Skasuję wpisy od 1006 do 1008.
for h in $(seq 1006 1008); do history -d 1006; done
Spowoduje to wygenerowanie
history -d
poleceń dla 1006, następnie 1007 stanie się 1006 i 1006 zostanie usunięte, a następnie 1008 (stało się 1007) to teraz 1006 i zostanie usunięte.Jeśli chciałem również usunąć polecenie usuwania historii, jest to nieco bardziej skomplikowane, ponieważ musisz znać aktualny wpis historii max.
Możesz to uzyskać za pomocą (może być lepszy sposób):
history 1 | awk '{print $1}'
Łącząc to razem, możesz użyć tego do usunięcia zakresu, a także usunięcia polecenia usuwania historii:
for h in $(seq 1006 1008); do history -d 1006; done; history -d $(history 1 | awk '{print $1}')
Podsumuj to wszystko w funkcji, aby dodać do
~/.bashrc
:histdel(){ for h in $(seq $1 $2); do history -d $1 done history -d $(history 1 | awk '{print $1}') }
Przykład usunięcia polecenia 4, 5 i 6 (1049-1051) i ukrycia dowodów:
[18:21:02 jonathag@gb-slo-svb-0221 ~]$ history 11 1046 25-04-2016 18:20:47 echo "Command 1" 1047 25-04-2016 18:20:48 echo "Command 2" 1048 25-04-2016 18:20:50 echo "Command 3" 1049 25-04-2016 18:20:51 echo "Command 4" 1050 25-04-2016 18:20:53 echo "Command 5" 1051 25-04-2016 18:20:54 echo "Command 6" 1052 25-04-2016 18:20:56 echo "Command 7" 1053 25-04-2016 18:20:57 echo "Command 8" 1054 25-04-2016 18:21:00 echo "Command 9" 1055 25-04-2016 18:21:02 echo "Command 10" 1056 25-04-2016 18:21:07 history 11 [18:21:07 jonathag@gb-slo-svb-0221 ~]$ histdel 1049 1051 [18:21:23 jonathag@gb-slo-svb-0221 ~]$ history 8 1046 25-04-2016 18:20:47 echo "Command 1" 1047 25-04-2016 18:20:48 echo "Command 2" 1048 25-04-2016 18:20:50 echo "Command 3" 1049 25-04-2016 18:20:56 echo "Command 7" 1050 25-04-2016 18:20:57 echo "Command 8" 1051 25-04-2016 18:21:00 echo "Command 9" 1052 25-04-2016 18:21:02 echo "Command 10" 1053 25-04-2016 18:21:07 history 11
Właściwie chodziło o usunięcie ostatnich 10 poleceń z historii, więc jeśli chcesz zaoszczędzić trochę wysiłku, możesz użyć innej funkcji, aby wywołać
histdel
funkcję, która wykonuje obliczenia za Ciebie.histdeln(){ # Get the current history number n=$(history 1 | awk '{print $1}') # Call histdel with the appropriate range histdel $(( $n - $1 )) $(( $n - 1 )) }
Ta funkcja przyjmuje 1 argument, liczbę poprzednich elementów historii do usunięcia. Aby usunąć ostatnie 10 poleceń z historii, po prostu użyj
histdeln 10
.źródło
history | tail -1 | awk '{print $1}'
można uprościć dohistory 1 | awk '{print $1}'
-bash: tac: command not found
w systemie Mac OSX, w przeciwnym razie byłaby to najlepsza odpowiedź.for h in $(seq 1006 1008); do history -d 1006; done
to działa w ubuntu 16.04for i in {1..10}; do history -d $(($HISTCMD-11)); done
for x in `seq $1 $2` do history -d $1 done
źródło
history -d 511
działa zgodnie z oczekiwaniami, a następniehistory -d 512
usuwa to, co było wcześniej 513, a 512 pozostaje w historii jako polecenie 511. Mam nadzieję, że to ma sens .$x
każdym razem w pętli, usuwam$1
. Więc najpierw usuwa 511, a 512 staje się 511. Następnie ponownie 511 i tak dalej.for i in
...history -d $i
i otrzymałem wyniki, które opisałem w moim komentarzu powyżej. Użycie 1 $ jest absolutnie poprawne, jak podano w oryginalnej odpowiedzi.Najpierw wpisz:
history
i zapisz sekwencję numerów linii, które chcesz usunąć.Aby wyczyścić linie z, powiedzmy, linii 1800 do 1815, napisz w terminalu:
$ for line in $(seq 1800 1815) ; do history -d 1800; done
Jeśli chcesz usunąć historię dla polecenia usunięcia, dodaj +1 dla 1815 = 1816, a historia dla tej sekwencji + polecenie usunięcia zostanie usunięte.
Na przykład :
$ for line in $(seq 1800 1816) ; do history -d 1800; done
źródło
$line
usuwa co drugą linię, a następnie przekracza pożądany zakres.Dzięki Bash 5 możesz teraz zrobić zakres ... Brawo !:
history -d 511-520
lub licząc wstecz 10:
history -d -10--1
Fragment strony Bash 5 Man :
Oto moje rozwiązanie dla Bash 4. Iteracyjnie usuwa pojedynczy wpis lub zakres historii zaczynając od najniższego indeksu.
delHistory () { count=$(( ${2:-$1} - $1 )) while [[ $count -ge 0 ]]; do history -d "$1" ((count--)) done } delHistory 511 520
źródło
Łączenie odpowiedzi z góry:
history -w vi ~/.bash_history history -r
źródło
edytować:
Zmieniono iteratory z usztywnieniem, dobry wynik. Wywołaj również tę funkcję z odwrotnym iteratorem.
Prawdopodobnie możesz zrobić coś takiego:
#!/bin/bash HISTFILE=~/.bash_history # if you are running it in a # non interactive shell history would not work else set -o history for i in `seq $1 $2`; do history -d $i done history -w
Gdzie przywołasz w ten sposób:
Zauważ, że nie wprowadziłem żadnego błędu sprawdzania granic. Zostawię to jako ćwiczenie dla czytelnika.
zobacz także to pytanie
źródło
seq 563 514
nic nie wydrukuje. Potrzebujeszseq 563 -1 514
. Alternatywnie możesz po prostu użyćhistory -d $1
z argumentami jako514 563
Może się komuś przyda.
Kiedy logujesz się do dowolnego użytkownika dowolnej konsoli / terminala, historia twojej bieżącej sesji istnieje tylko w jakimś "buforze", który jest opróżniany do ~ / .bash_history przy twoim wylogowaniu.
Tak więc, aby zachować wszystko w tajemnicy, możesz po prostu:
history -r && exit
a zostaniesz wylogowany z wyczyszczoną historią sesji (i tylko);)
źródło
Użyłem kombinacji rozwiązań udostępnionych w tym wątku, aby usunąć ślad w historii poleceń. Najpierw sprawdziłem, gdzie jest zapisana historia poleceń z:
echo $HISTFILE
Edytowałem historię za pomocą:
Następnie opróżniam bufor historii bieżącej sesji z:
history -r && exit
Następnym razem, gdy wejdziesz do tej sesji, ostatnie polecenie, które zobaczysz w historii poleceń, jest ostatnim, które pozostawiłeś w pathToFile .
źródło
aby usunąć ostatnie 10 wpisów (na podstawie Twojego przykładu):
history -d 511 520
źródło
history -c wyczyści wszystkie historie.
źródło
Używam tego skryptu, aby usunąć ostatnie 10 poleceń w historii:
pos=$HISTCMD; start=$(( $pos-11 )); end=$(( $pos-1 )); for i in $(eval echo "{${start}..${end}}"); do history -d $start; done
Używa
$HISTCMD
zmiennej środowiskowej, aby uzyskać indeks historii i używa go do usunięcia ostatnich 10 wpisów whistory
.źródło
Spróbuj wykonać następujące czynności:
for i in {511..520}; do history -d $i; echo "history -d $i"; done
źródło
for i in {511..520}; do history -d $i; echo "history -d 511"; done
Używam tego (mam bash 4):
histrm() { local num=${1:- 1} builtin history -d $(builtin history | sed -rn '$s/^[^[:digit:]]+([[:digit:]]+)[^[:digit:]].*$/\1/p') (( num-- )) && $FUNCNAME $num builtin history -w }
W
builtin history
części, jak również ostatni-w
jest, bo mam w miejscu odmianę słynnego mijającym historii zakładowego na zaciskach i funkcja ta pęknie bez tych elementów. Zapewniają wywołanie prawdziwegohistory
wbudowanego basha (a nie mojego własnego opakowania) i zapisują historię do HISTFILE zaraz po usunięciu wpisów.Jednak będzie to działać tak, jak w przypadku „normalnych” konfiguracji historii.
Powinieneś nazwać go liczbą ostatnich wpisów, które chcesz usunąć, na przykład:
Usunie ostatnie 10 wpisów.
źródło
history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;
Brutalny, ale funkcjonalny
źródło
for h in $(seq $(history | tail -1 | awk '{print $1-N}') $(history | tail -1 | awk '{print $1}') | tac); do history -d $h; done; history -d $(history | tail -1 | awk '{print $1}')
Jeśli chcesz usunąć 10 linii, po prostu zmień wartość N na 10.
źródło
Prosta funkcja może zabić wszystko według numeru (chociaż działa na błędach)
kill_hist() { for i in $(echo $@ | sed -e 's/ /\n/g;' | sort -rn | sed -e 's/\n/ /;') do history -d $i; done } kill_hist `seq 511 520` # or kill a few ranges kill_hist `seq 1001 1010` `seq 1200 1201`
źródło
Krótko, ale słodko:
for i in {1..10}; do history -d $(($HISTCMD-11)); done
źródło