Jak usunąć pojedynczą linię z historii?

Odpowiedzi:

338

Działania zapobiegawcze

Jeśli chcesz uruchomić polecenie bez zapisywania go w historii, dodaj je z dodatkową spacją

prompt$ echo saved
prompt$  echo not saved \
> #     ^ extra space

Aby to zadziałało trzeba albo ignorespaceczy ignorebothw HISTCONTROL. Na przykład uruchom

HISTCONTROL=ignorespace

Aby to ustawienie pozostało trwałe, umieść je w swoim .bashrc.

Oczyszczanie poubojowe

Jeśli już uruchomiłeś polecenie i chcesz je usunąć z historii, najpierw użyj

history

aby wyświetlić listę poleceń w twojej historii. Znajdź numer obok tego, który chcesz usunąć (np. 1234) i uruchom

history -d 1234

Ponadto, jeśli wiersz, który chcesz usunąć, został już zapisany w $ HISTFILE (co zwykle dzieje się, gdy domyślnie kończysz sesję), będziesz musiał ponownie zapisać w $ HISTFILE, lub wiersz pojawi się ponownie, gdy otworzysz nowy sesja:

history -w
jw013
źródło
Zadziałało. Myślę, że musimy zmodyfikować ~ / .bashrc po modyfikacji ...
B Seven
3
@ jw013 Ustawiłem PROMPT_COMMAND na history -a, w takim przypadku jest on już zapisany w pliku historii, a nie przy wyjściu w normalnej konfiguracji. W szczególności: mywiki.wooledge.org/BashFAQ/088
jordanm
5
Po usunięciu pojedynczego wiersza musisz zapisać bieżącą historię w $ HISTFILE za pomocą history -w. W przeciwnym razie po wyjściu usunięta linia będzie nadal dostępna!
Felipe Alvarez
1
+1 do powyższego komentarza; użycie history -wpo history -d {num}było dokładnie tym, czego potrzebowałem - ten krytyczny smakołyk powinien zostać dodany do odpowiedzi, w przeciwnym razie użytkownik może pomyśleć, że tymczasowe usunięcie z bieżącej powłoki jest trwałe.
Michael
1
@BobStein history -wjest niezbędny w przypadku wpisów, które zostały już zapisane w .bash_historypliku. Jak się powielać (np. W CentOS 7 z konfiguracją zapasów): 1. zaloguj się 2. wprowadź polecenie echo foo3. wyloguj się 4. zaloguj się ponownie 5. usuń wpis dla echo foo6. wyloguj się 7. zaloguj się ponownie: wpis jest nadal dostępny. W zależności od tego, jak skonfigurujesz swoją historię bash, być może możesz odtworzyć ten problem na inne sposoby - tj. Jeśli sprowokujesz zapis historii przed wylogowaniem.
maxschlepzig
53
  1. Aby wyczyścić całą historię, użyj

    history -c
  2. Aby usunąć pojedynczy wiersz, użyj

    history -d linenumber
soumyaranjan
źródło
6

Mam to w swoim ~/.bashrc, co powoduje, że polecenie $ forgetusuwa poprzednie polecenie z historii

function forget() {                                                              
   history -d $(expr $(history | tail -n 1 | grep -oP '^ \d+') - 1);              
}
Ryan Haining
źródło
To wydaje się trochę skomplikowane. Czy nie history -d $( history | tail -n 1 | cut -f 1 -d " " )byłoby prostsze?
seumasmac
1
history | tail -n1to historysamo polecenie, więc usunięcie tego numeru powoduje błędny wpis. Jednak history -d $( history | awk 'END{print $1-1}' )łączy linię wybrać, pole zaznaczyć, a odejmowanie.
dave_thompson_085
Czy jest jakaś szansa, że ​​ktoś może pomóc w przeniesieniu tego do Zshell?
Alex S
6

Zawsze możesz edytować i usuwać wpisy ~/.bash_history, co jest przydatne, gdy chcesz usunąć jeden lub więcej wpisów

Weslor
źródło
2
Najprawdopodobniej wpisy te zostaną ponownie wprowadzone po wyjściu z powłoki.
l0b0
5

Jeśli chcesz zapomnieć o całej sesji bash, możesz wykonać killbieżący proces bash. Ponieważ zmienna $$przytrzymaj pidbieżącej powłoki, można zrobić:

kill -9 $$
Bruno Bronosky
źródło
1

Musisz zapisać zmiany po wyczyszczeniu historii. A jeśli nie chcesz mieć w historii polecenia czyszczenia historii, musisz uruchomić polecenie w ten sposób:

history -c && history -w && logout

Powodzenia.

użytkownik882786
źródło
-1
Adding another point suppose if you want to delete a range of history lines

You can use below script. 

Below example will delete history output from line 1 to line 150.

for i in `history | awk 'NR > 1 && NR <=150{print   $1}'`; do history -d $i; done
Praveen Kumar BS
źródło