Hapus baris N terakhir dari riwayat bash

40

Ketika secara tidak sengaja menempelkan file ke dalam shell itu menempatkan satu ton entri omong kosong jelek dalam sejarah bash. Apakah ada cara bersih untuk menghapus entri-entri itu? Jelas saya bisa menutup shell dan mengedit .bash_historyfile secara manual tetapi mungkin ada beberapa jenis API yang tersedia untuk mengubah sejarah shell saat ini?

Pencuri
sumber

Jawaban:

36

Anda dapat menggunakan history -d offsetbuiltin untuk menghapus baris tertentu dari riwayat shell saat ini, atau history -cuntuk menghapus seluruh riwayat.

Ini tidak benar-benar praktis jika Anda ingin menghapus berbagai garis, karena hanya membutuhkan satu offset sebagai argumen, tetapi Anda bisa membungkusnya dalam suatu fungsi dengan loop.

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

Sebut saja dengan rmhist first_line_to_delete last_line_to_delete. (Nomor baris sesuai dengan output history.)

(Gunakan history -wuntuk memaksa menulis ke file histori.)

Tikar
sumber
1
Karena OP meminta untuk menghapus N baris terakhir , skrip ini harus dimodifikasi dengan melakukan sesuatu seperti: tot_lines=$(history | wc -l)dan kemudian ulangi history -d $(( tot_lines - $1 )).
PlasmaBinturong
2
Alih-alih $(history | wc -l), ada variabel $HISTCMDyang bisa digunakan.
PlasmaBinturong
29

Hanya liner yang satu ini di command prompt akan membantu.

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

Tempat START_NUM memulai posisi entri dalam riwayat. N adalah jumlah entri yang ingin Anda hapus.

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

pengguna2982704
sumber
3
Saya bertanya-tanya mengapa ini bukan fungsi bawaan. 'Sejarah' adalah alat yang sangat tua.
Petr Gladkikh
melayani tujuan dengan sangat baik, tetapi perintah ini dapat dilihat dalam sejarah :)
Rajeev Akotkar
askubuntu.com/a/978276/22866 memiliki cara yang bagus untuk menghapus "delete from history command" dari history :-)
HanSooloo
0

Jawaban oleh user2982704 hampir berhasil untuk saya tetapi tidak cukup. Saya harus membuat variasi kecil seperti ini.

Dengan asumsi riwayat saya adalah 1000 dan saya ingin menghapus 50 entri terakhir

start=1000

for i in {1..50}; do count=$((start-i)); history -d $count; done
aberpaul
sumber