Come eliminare i risultati selezionati dalla cronologia di bash?


66

historyIl comando mostra tutti i risultati ma possiamo filtrare per ottenere un comando particolare usando history | grep searchingCommand. È veramente utile.

Ma il problema è che mostra anche quei comandi che sono stati inseriti con errore di battitura o che non hanno avuto successo. Quindi identificare quello corretto è davvero un dolore. Ho controllato questo link: Cronologia comandi selettiva nel terminale? ma quella non era la mia soluzione.

Quindi c'è un modo per eliminare quei comandi dalla cronologia che era errato al momento inserito o successivo?


5
Per favore, cambia la risposta accettata, ce ne sono altre con più di 100 voti.
greuze,

1
@greuze: modificato con la risposta migliore. Il conteggio dei voti non significa che sia il migliore!
Saurav Kumar,

Risposte:


20

Vorrei aggiungere un altro metodo per modificare (o eliminare) le voci della cronologia, che ho trovato piuttosto accidentalmente mentre stavo lavorando con la bash:

Per dimostrarlo, inizia eseguendo i seguenti tre comandi in bash:

$ echo 1
1
$ echo 2
2
$ echo 3
3

Ora puoi selezionare nuovamente questi comandi usando i tasti freccia o Ctrl+ pe Ctrl+ n.

Supponi di voler modificare i primi due comandi. Spostati nella cronologia finché non echo 1viene visualizzato e modificalo in echo 1 - changed, ma NON PREMERE INVIO. Se ora ti sposti ulteriormente nella tua cronologia, questa linea rimane nel suo stato modificato e puoi spostarti da e verso di essa. Ora passa alla linea echo 2e modificala in echo 2 - changed, di nuovo non premere invio. Per salvare le modifiche a queste righe, seleziona qualsiasi comando nella cronologia tranne queste due e premi Ctrl+ c.

Naturalmente, invece di modificare la voce della cronologia, puoi anche rimuoverla, il che si tradurrà in una riga vuota in quella voce. Per eliminare la riga attualmente visualizzata al prompt, premi Ctrl+ e(che salta alla fine della riga) seguito da Ctrl+ u(che elimina il testo dall'inizio della riga al cursore).

Vedi anche https://unix.stackexchange.com/questions/195668/what-can-cause-an-item-to-be-deleted-from-my-bash-history/195726#195726 per una spiegazione più dettagliata del background tecnico.

Modo più semplice:

  1. ctrl+ rper cercare il comando che si desidera eliminare / modificare.
  2. end per selezionare il comando cercato da eliminare / modificare
  3. Elimina o modifica il comando selezionato (non premere entero ctrl+ c)
  4. freccia su (o ctrl+ p) o freccia giù (o ctrl+ n) per selezionare qualsiasi altro comando.
  5. ctrl+ c Questo è tutto!

Nota :

Questo cambia solo i comandi della sessione corrente. Se vogliamo cambiare i comandi più vecchi e salvare le modifiche, dobbiamo eseguire il comando seguente prima di chiudere il terminale:

history -w

Mille grazie Stefan! Devo dire che hai portato cose fantastiche. Usando questo ho trovato il modo più semplice per modificare / cancellare la cronologia: 1.ctrl+r per cercare il comando che si desidera cancellare / modificare. 2.end per spostare il comando ed eliminare / modificare il comando. 3.ctrl+n per passare alla riga successiva e poi 4.ctrl+c
Saurav Kumar,

144

Uso:

history -d OFFSET

per eliminare la voce della cronologia in offset OFFSETanche prima che fosse aggiunta al file della cronologia di bash. Per scoprire il giusto OFFSET, devi solo eseguire il historycomando. È il numero dall'inizio della riga che contiene la voce della cronologia che si desidera eliminare.

E per salvare le modifiche alla cronologia utilizzare:

history -w

Vedi maggiori dettagli in questa guida .


non male :) Buono per avere un nuovo modo ..
Saurav Kumar,

10
@SauravKumar Non male?!? Probabilmente è il modo migliore ...
Radu Rădeanu,

5
LEGGI PRIMA: solo per essere chiari è necessario fare le history -wparole d'ordine per salvare le modifiche. Anche OFFSET indica il numero historyvisualizzato. Se la riga che si sta tentando di eliminare è 873, utilizzare history -d 873.
Cammy_the_block

2
@ RaduRădeanu Utilizzare history -wdopo history -dper salvare le modifiche.
Cammy_the_block

20
Questa dovrebbe essere la risposta corretta.
topher

19

Modifica il file ~/.bash_historyed elimina una volta con errori di battitura

Ad esempio, inserire questo comando:

gedit ~/.bash_history

Modifica qualcosa che ti piace e dopo di salvare il file e riavviare il terminale. Il comando root è:

sudo -i 
inser your password
gedit ~/.bash_history

se vuoi cancellare tutto history -cdovresti fare il trucco


SINTASSI

history
history [n]
history -c
history -d offset
history [-anrw] [filename]
history -ps arg

CHIAVE

-c Cancella l'elenco cronologico. Questo può essere combinato con le altre opzioni per sostituire completamente l'elenco della cronologia.

-d offset Elimina la voce della cronologia all'offset di posizione. l'offset deve essere specificato come appare quando viene visualizzata la cronologia.

-a Aggiungi le nuove righe della cronologia (righe della cronologia inserite dall'inizio della sessione corrente di Bash) al file della cronologia.

-n Aggiunge le righe della cronologia non già lette dal file della cronologia all'elenco cronologico corrente. Queste sono le linee aggiunte al file della cronologia dall'inizio della sessione corrente di Bash.

-r Leggi il file della cronologia corrente e ne aggiunge il contenuto all'elenco della cronologia.

-w Scrive la cronologia corrente nel file della cronologia.

-p Esegue la sostituzione della cronologia sugli arg e visualizza il risultato sull'output standard, senza salvare i risultati nell'elenco cronologico.

-s Gli arg vengono aggiunti alla fine dell'elenco cronologico come una singola voce.

fonte :


Grazie è utile! Sai come eliminare la voce al momento dell'inserimento dalla riga di comando? O c'è qualche comando per cancellare la voce senza aprire il .bash_history?
Saurav Kumar,

1
@ bladed19899 history -cnon funziona Quando chiudo il terminale e lo apro di nuovo, le cronologie non vengono eliminate. -1 la tua risposta
αғsнιη il

1
@KasiyA, -c Clear the history list. This may be combined with the other options to replace the history list completely. fonte
blade19899,

2
@KasiyA Utilizzare history -wafter history -cper scrivere le modifiche.
Cammy_the_block

16

Se vuoi eliminarlo immediatamente dallo stesso terminale prima devi aggiungere quanto segue al tuo file ~ / .bashrc.

PROMPT_COMMAND='history -a' 

e riavvia il tuo terminale.

Puoi aggiungerlo ovunque nel file .bashrc. Ho aggiunto come di seguito insieme ad altre cose relative alla storia.

inserisci qui la descrizione dell'immagine

Di solito durante una sessione bash i comandi eseguiti non vengono scritti in .bash_history fino a quando la sessione non viene terminata, quindi PROMPT_COMMAND='history -a'immette il comando quindi e lì in .bash_history.

Ora ogni volta che si commette un errore o un errore in un comando e si desidera eliminarlo, eseguire semplicemente quanto segue

sed -i '$d' ~/.bash_history

e tada sarebbe cancellato.

Per renderlo più semplice puoi aliaslo in qualcosa di più semplice e usarlo come

alias rh ='sed -i '\''$d'\'' ~/.bash_history'

Quindi l'esecuzione rhrimuoverà l'ultimo comando eseguito dalla cronologia.

Quanto sopra è un alias temporaneo che dura solo per una sessione. Per renderlo permanente o persistente

alias rh = 'sed -i '\''$d'\'' ~/.bash_history' 

a .bashrc

NOTA

Non ci dovrebbe essere spazio su entrambi i lati di =

Se non vuoi Alias, puoi anche fare quanto segue

Crea un nome commad rhe posizionalo nella /bindirectory:

  • Apri un file dicendo rhe incolla il seguente codice, salva e chiudi:

    sed -i '$d' ~/.bash_history

  • Rendi rheseguibile e posizionalo nella /bindirectory:

     chmod + x rh
     sudo cp rh / bin 
  • Ora usa il rhcomando per cancellare il comando recente dalla cronologia.


Dove aggiungere PROMPT_COMMAND='history -a'nel .bashrcfile? E cosa farà esattamente? Ho provato sed -i '$d' ~/.bash_historya funzionare senza modifiche .bashrc!! Ma la cosa alias non funziona .. Accetterò la tua risposta se elaborassi la mia domanda e
facessi

@SauravKumar ha modificato la risposta. Avevo perso le virgolette singole e doppie nel comando di aliasing. Mio cattivo ..: P
Stormvirux

Credetemi o no .. la cosa alias non funziona ancora .. Si esegue senza errori ma non cancella la voce dal .bash_historyfile ..: P comunque .. Non è un problema .. Ho fatto il mio comando e l'ho inserito /bindirectory. Dal momento che a causa del tuo comando: sed -i "$d" ~/.bash_historysta funzionando bene. Accetto la tua risposta .. :)
Saurav Kumar,

Se non ti dispiace, vorrei modificare la tua risposta in modo che possa essere utile agli altri ..
Saurav Kumar,

In realtà l'ho modificato. Devi approvarlo ..
Saurav Kumar,

2

per rimuovere più righe (ad es. dal 1974 al 1990, controllare con historycomando):

  for i in `seq 1974 1990` ; do history -d 1974 ; done

si noti che il numero di riga da rimuovere è sempre lo stesso, poiché lo si rimuove costantemente e si passa al successivo.


La nota è molto importante.
Weijun Zhou,

1

Se stai usando l'opzione "set -o vi" in bash (molto utile per cercare di nuovo con il tasto Esc), allora puoi cercare la linea ed eliminare la linea con "dd" nello stesso modo in "vi".


Trovo che devo digitare jo kdopo ddper rendere effettivamente il comando dalla cronologia. Se scrivo un altro comando, o semplicemente premo Enter, bash sembra supporre che sia solo un nuovo comando e che dovrebbe conservare il vecchio comando nella storia. È anche interessante notare che quando viene eseguito correttamente, cancella il comando, ma non lo elimina: il risultato sono voci di cronologia vuote. Ma questo è abbastanza buono per rimuovere le password che sono stato costretto a digitare dalla riga di comando e molto più facile rispetto ad altre risposte, quindi grazie mille per aver pubblicato questo!
Michael Scheper,

0

Ho avuto una situazione in cui avevo voci superflue nella mia storia di bash da una Yubikey - forse 50 o giù di lì, corrispondenti a 'ccccc .....'. Idealmente, volevo un modo per eliminare le voci corrispondenti a un modello, che suppongo tu possa fare con sed o qualcosa del genere, supponendo che la tua cronologia ignori gli spazi vuoti.

Ad ogni modo, sono diventato pigro e ho finito per usare vim, cercare 'cccc' e usare 'dd' mentre scorrevo ogni partita. Non ci è voluto più di un minuto.


1
Se lo stai facendo in vim, potresti anche fare: g / cccc / d oppure: g / ^ cccc / d: o usare una macro qqnddq quindi @@ (suppone che la tua ultima ricerca sia stata per ccccc).
htaccess

@htaccess Sarebbe stato sicuramente più facile, ma in un certo senso volevo ispezionare visivamente il resto del file allo stesso tempo.
Dylan_Larkin
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.