Geçmişteki belirli bir dizeyle eşleşen komutlar nasıl silinir?


14

Geçmişimdeki bir dizeyle eşleşen tüm komutları silmem gerekiyor. Denedim:

$ history | grep searchstring | cut -d" " -f2 | history -d
-bash: history: -d: option requires an argument

$ history | grep searchstring | cut -d" " -f2 | xargs history -d
xargs: history: No such file or directory

$ temparg() { while read i; do "$@" "$i"; done }
$ history | grep searchstring | cut -d" " -f2 | temparg history -d
(no error, but nothing is deleted)

Bunu yapmanın doğru yolu nedir?


1
Aşağıda çalışan cevaplar olsa da, neden işe yaramadığını merak ediyorum history -d X. Bu soruya rastladım çünkü daha yeni yapmıştım history | grep search_str | sort -nr | awk '{print $1}' | while read i; do history -d $i; done. Hata yok, ancak silinen hiçbir şey yok. Neden kimse açıklayabilir?
mivk

Yanıtlar:


19

historyKomut sadece senin geçmiş dosya üzerinde çalışır $HISTFILE(tipik ~/.historyveya ~/.bash_history). Bu dosyadan satırları kaldırmanız çok daha kolay olacaktır, bu da birçok yolla yapılabilir. grepbir yoludur, ancak dosyayı okurken üzerine yazmamaya dikkat etmelisiniz:

$ grep -v searchstring "$HISTFILE" > /tmp/history
$ mv /tmp/history "$HISTFILE"

Başka bir yol sed:

$ sed -i '/searchstring/d' "$HISTFILE"

İyi cevap; $HISTFILEmuhtemelen alıntı yapmaya değer alanlar içerebilir.
Chris Down

Dikkatli olun ... histfile tahmin edilemez, eğer birçok açık merminiz varsa, tam olarak neyin ve hangi sırayla kaydedileceğini söylemezsiniz. Zaten açık olan mermilerin, kapatıldıklarında başlangıçta yükledikleri geçmişi yeniden yazmadığını onaylayabilir mi?
orion

8

Geçerli oturumdaki komutları kaldırmayı umursamazsanız, Michael Mrozek'in cevabı işe yarayacaktır. Bunu yaparsanız, gönderisinde işlemleri yapmadan önce geçmiş dosyasına yazmalısınız history -a.

Eğer geçmiş dosyasından istediğiniz girdileri çıkardıktan sonra Ayrıca, sen düzenlenmek suretiyle yeniden yükleyebilirsiniz history -csonra history -r.


3

Tek astar arayanlar için:

while history -d $(history | grep 'SEARCH_STRING_GOES_HERE'| head -n 1 | awk {'print $1'}) ; do :; history -w; done

Yani, örneğin istersen. içinde bir şifre bulunan birden fazla satırı silerseniz, "SEARCH_STRING_GOES_HERE" yerine şifreyi koyabilirsiniz. Bu, tüm arama geçmişinizi bu arama dizesi için arar ve siler.

Dikkat edilmesi gereken 2 şey

  • argüman olarak -F sağlamazsanız grep regex kullanır
  • Başka eşleşme kalmadığında, komut 1 hata gösterir. Boşver.

Bir hata aldım (-bash: history: -d: seçenek bir bağımsız değişken gerektirir), ama yine de çalıştı?
paradroid

1
Bir hata ile başarısız olana kadar delete komutunu sürekli olarak çalıştırır (çünkü silinecek başka bir şey yoktur). Sadece hatayı yok sayın.
thelogix

Bu sadece çevrimiçi değil, aynı zamanda doğru basit cevaptır. Evet , history: -d: option requires an argumenthatayı karıştırmayın ! While döngüsünün sonunda = = beklenen - işe yarıyor ve temelde "Başka bir şey bulamıyorum!" :)
jave.web

2

Michael ve Chris'in cevaplarına dayanarak aşağıdakileri buldum. Senin bunu ekleyin ~/.bashrcdosyası ve sonra da ile yük . ~/.bashrcveya source ~/.bashrc.

:<<COMMENT
    Deletes all lines from the history that match a search string, with a
    prompt. The history file is then reloaded into memory.

    Examples
        hxf "rm -rf"
        hxf ^source

    See:
    - https://unix.stackexchange.com/questions/57924/how-to-delete-commands-in-history-matching-a-given-string
COMMENT
#The unalias prevents odd errors when calling". ~/.bashrc" (May result in
#"not found" errors. That's okay).
unalias hxf
hxf()  {
    read -r -p "About to delete all items from history that match \"$1\". Are you sure? [y/N] " response
    response=${response,,}    # tolower
    if [[ $response =~ ^(yes|y)$ ]]
    then
        #Delete all matched items from the file, and duplicate it to a temp
        #location.
        echo -e "grep -v \"$1\" \"$HISTFILE\" > /tmp/history"
        grep -v "$1" "$HISTFILE" > /tmp/history

        #Clear all items in the current sessions history (in memory). This
        #empties out $HISTFILE.
        echo "history -c"
        history -c

        #Overwrite the actual history file with the temp one.
        echo -e "mv /tmp/history \"$HISTFILE\""
        mv /tmp/history "$HISTFILE"

        #Now reload it.
        echo -e "history -r \"$HISTFILE\""
        history -r "$HISTFILE"     #Alternative: exec bash
    else
        echo "Cancelled."
    fi
}

1
cat "$HISTFILE" | grep -v "commandToDelete" >> "$HISTFILE" && exit

Bu benim için çalıştı. history -c && history -a geçmiş dosyasını benim için düzgün bir şekilde yeniden yüklemedi. Bunun yerine, geçmiş dosyasını yeniden yazdıktan hemen sonra oturumumdan çıkıyorum, böylece bellekteki dosya üzerine yazmıyor.


Bu komut, diskinizi yinelenen geçmiş değerleriyle dolduracaktır.
Ashley
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.