Come rimuovere una singola riga dalla cronologia?


Risposte:


340

Misure preventive

Se si desidera eseguire un comando senza salvarlo nella cronologia, anteprimerlo con uno spazio aggiuntivo

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

Perché questo funzioni è necessario uno ignorespaceo ignorebothdentro HISTCONTROL. Ad esempio, esegui

HISTCONTROL=ignorespace

Per rendere persistente questa impostazione, inseriscila nel tuo .bashrc.

Pulizia post mortem

Se hai già eseguito il comando e desideri rimuoverlo dalla cronologia, utilizza prima

history

per visualizzare l'elenco dei comandi nella cronologia. Trova il numero accanto a quello che desideri eliminare (ad es. 1234) ed esegui

history -d 1234

Inoltre, se la riga che desideri eliminare è già stata scritta nel tuo $ HISTFILE (che di solito accade quando finisci una sessione di default), dovrai riscrivere in $ HISTFILE, o la riga riapparirà quando apri un nuovo sessione:

history -w

Ha funzionato. Penso che dovremo procurarci ~ / .bashrc dopo averlo modificato ...
B Seven,

3
@ jw013 Ho impostato PROMPT_COMMAND su history -a, in quel caso è già scritto nel file della cronologia, piuttosto che all'uscita in configurazione normale. In particolare: mywiki.wooledge.org/BashFAQ/088
jordanm

5
Dopo aver eliminato una singola riga, devi scrivere la cronologia corrente sul tuo $ HISTFILE usando history -w. Altrimenti quando esci, la linea eliminata è ancora lì!
Felipe Alvarez, il

1
+1 al commento sopra; usare history -wafter history -d {num}era esattamente ciò di cui avevo bisogno: aggiungere tidbit critico alla risposta, altrimenti un utente potrebbe pensare che un'eliminazione temporanea dalla shell corrente sia effettivamente permanente.
michael,

1
@BobStein history -wè necessario per le voci che sono già state scritte nel .bash_historyfile. Come riprodurre (ad es. Su CentOS 7 con configurazione stock): 1. accedi 2. inserisci il comando echo foo3. disconnetti 4. accedi di nuovo 5. cancella la voce per echo foo6. disconnetti 7. accedi ancora: la voce è ancora lì. A seconda di come si configura la cronologia di bash, forse è possibile riprodurre questo problema in altri modi, ad esempio se si provoca la scrittura della cronologia prima della disconnessione.
maxschlepzig,

53
  1. Per cancellare tutta la cronologia, utilizzare

    history -c
  2. Per eliminare una singola riga, utilizzare

    history -d linenumber

6

Ho questo nel mio ~/.bashrc, che rende il comando $ forgetcancella il comando precedente dalla storia

function forget() {                                                              
   history -d $(expr $(history | tail -n 1 | grep -oP '^ \d+') - 1);              
}

Sembra un po 'complicato. Non history -d $( history | tail -n 1 | cut -f 1 -d " " )sarebbe più semplice?
seumasmac,

1
history | tail -n1è il historycomando stesso, quindi l'eliminazione di quel numero ottiene la voce errata. Tuttavia, history -d $( history | awk 'END{print $1-1}' )combina la selezione della linea, la selezione del campo e la sottrazione.
dave_thompson_085,

Qualche possibilità che qualcuno possa dare una mano porting questo su zshell?
Alex S

6

È sempre possibile modificare e rimuovere le voci da ~/.bash_history, utile quando si desidera rimuovere una o più voci


2
Molto probabilmente queste voci verranno reintrodotte all'uscita dalla shell.
l0b0

5

Se vuoi dimenticare l'intera sessione di bash, puoi eseguire killl'attuale processo di bash. Poiché la variabile $$contiene la pidshell corrente, puoi fare:

kill -9 $$

1

È necessario scrivere le modifiche dopo aver cancellato la cronologia. E se non desideri avere il comando di cancellazione della cronologia nella cronologia, devi eseguire il comando in questo modo:

history -c && history -w && logout

In bocca al lupo.


-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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.