Usuń ostatnie N linii z historii bash

40

Podczas przypadkowego wklejenia pliku do powłoki umieszcza mnóstwo brzydkich bzdur w historii bash. Czy istnieje czysty sposób na usunięcie tych wpisów? Oczywiście mogę zamknąć powłokę i edytować .bash_historyplik ręcznie, ale może istnieje jakiś interfejs API do modyfikacji historii bieżącej powłoki?

ThiefMaster
źródło

Odpowiedzi:

36

Możesz użyć history -d offsetwbudowanego, aby usunąć określony wiersz z historii bieżącej powłoki lub history -cwyczyścić całą historię.

Nie jest to praktyczne, jeśli chcesz usunąć zakres linii, ponieważ jako argument przyjmuje tylko jedno przesunięcie, ale możesz zawinąć go w funkcję za pomocą pętli.

rmhist() {
    start=$1
    end=$2
    count=$(( end - start ))
    while [ $count -ge 0 ] ; do
        history -d $start
        ((count--))
    done
}

Zadzwoń za pomocą rmhist first_line_to_delete last_line_to_delete. (Numery wierszy zgodnie z wyjściem history.)

(Użyj, history -waby wymusić zapis do pliku historii.)

Mata
źródło
1
Ponieważ OP poprosił o usunięcie N ostatnich linii, skrypt ten należy zmodyfikować, wykonując coś takiego: tot_lines=$(history | wc -l)a następnie powtórz history -d $(( tot_lines - $1 )).
PlasmaBinturong
2
Zamiast tego $(history | wc -l)istnieje zmienna, $HISTCMDktórej można użyć.
PlasmaBinturong
29

Tylko ta jedna linijka w wierszu polecenia pomoże.

for i in {1..N}; do history -d START_NUM; done

Gdzie START_NUM jest początkową pozycją wpisu w historii. N to liczba pozycji, które możesz chcieć usunąć.

dawny: for i in {1..50}; do history -d 1030; done

użytkownik2982704
źródło
3
Zastanawiam się, dlaczego nie jest to już wbudowana funkcja. „historia” jest bardzo starym narzędziem.
Petr Gladkikh
bardzo dobrze służy temu celowi, ale to polecenie można zobaczyć w historii :)
Rajeev Akotkar
askubuntu.com/a/978276/22866 ma dobry sposób na usunięcie polecenia „usuń z historii” z historii :-)
HanSooloo
0

Odpowiedź od user2982704 prawie dla mnie zadziałała, ale nie do końca. Musiałem dokonać takiej małej zmiany.

Zakładając, że moja historia to 1000 i chcę usunąć 50 ostatnich wpisów

start=1000

for i in {1..50}; do count=$((start-i)); history -d $count; done
aberpaul
źródło