Perintah berikut
511 clear
512 history
513 history -d 505
514 history
515 history -d 507 510 513
516 history
517 history -d 509
518 history
519 history -d 511
520 history
Saya dapat menghapus satu per satu history -d 511
, tetapi bagaimana cara menghapus 10 perintah terakhir dan di antara 10 perintah sejarah menggunakan perintah tunggal di shell?
Bisakah kita menulis skrip bash dan mengeksekusi untuk penghapusan sejarah?
vi $HISTFILE
dan hapus yang Anda inginkan. Gunakanhead -n -10
jika Anda harus mengotomatiskannya.Jawaban:
Sudahkah Anda mencoba mengedit file riwayat secara langsung:
sumber
~/.viminfo
jadi pastikan untuk menghapusnya juga!.bash_history
dapat ditimpa oleh apa yang disimpan dalam memori. Saya menemukan solusi ini bermanfaat: superuser.com/a/384383/253543Jawaban saya didasarkan pada jawaban sebelumnya, tetapi dengan penambahan membalik urutan sehingga item riwayat dihapus dari yang terbaru ke yang paling baru.
Dapatkan riwayat Anda saat ini (sesuaikan jumlah garis yang ingin Anda lihat):
Ini memberi saya sesuatu seperti
Pilih posisi awal dan akhir untuk item yang ingin Anda hapus. Saya akan menghapus entri 1006 hingga 1008.
Ini akan menghasilkan
history -d
perintah untuk 1006, kemudian 1007 menjadi 1006 dan 1006 dihapus, maka 1008 (menjadi 1007) sekarang 1006 dan dihapus.Jika saya juga ingin menghapus perintah delete history maka itu sedikit lebih rumit karena Anda perlu mengetahui entri max history saat ini.
Anda bisa mendapatkan ini dengan (mungkin ada cara yang lebih baik):
Menyatukannya Anda dapat menggunakan ini untuk menghapus rentang, dan juga menghapus perintah hapus riwayat:
Bungkus semuanya dalam fungsi untuk ditambahkan ke
~/.bashrc
:Contoh menghapus perintah 4, 5 dan 6 (1049-1051) dan menyembunyikan bukti:
Pertanyaannya sebenarnya adalah menghapus 10 perintah terakhir dari histori, jadi jika Anda ingin menyimpan sedikit usaha, Anda bisa menggunakan fungsi lain untuk memanggil
histdel
fungsi yang melakukan perhitungan untuk Anda.Fungsi ini membutuhkan 1 argumen, jumlah item riwayat sebelumnya untuk dihapus. Jadi untuk menghapus 10 perintah terakhir dari riwayat cukup gunakan
histdeln 10
.sumber
history | tail -1 | awk '{print $1}'
dapat disederhanakan menjadihistory 1 | awk '{print $1}'
-bash: tac: command not found
pada Mac OSX, jika tidak, ini akan menjadi jawaban terbaik.for h in $(seq 1006 1008); do history -d 1006; done
ini berfungsi di ubuntu 16.04for i in {1..10}; do history -d $(($HISTCMD-11)); done
sumber
history -d 511
berfungsi seperti yang diharapkan, kemudianhistory -d 512
menghapus apa yang dulunya 513, dan 512 tetap dalam sejarah sebagai perintah 511. Harapan itu masuk akal .$x
setiap kali melalui loop, saya menghapus$1
. Jadi pertama menghapus 511, dan 512 menjadi 511. Kemudian menghapus 511 lagi, dan seterusnya.for i in
... danhistory -d $i
dan mendapatkan hasil yang saya jelaskan dalam komentar saya di atas. Menggunakan $ 1 ini benar-benar benar seperti yang dinyatakan dalam jawaban asli Anda.Pertama, ketik:
history
dan tuliskan urutan nomor baris yang ingin Anda hapus.Untuk menghapus baris dari katakanlah baris 1800 hingga 1815 tulis yang berikut di terminal:
Jika Anda ingin menghapus histori untuk perintah penghapusan, tambahkan +1 untuk 1815 = 1816 dan histori untuk urutan itu + perintah penghapusan akan dihapus.
Sebagai contoh :
sumber
$line
menghapus setiap baris lainnya dan kemudian melebihi kisaran yang diinginkan.Dengan Bash 5 sekarang Anda dapat melakukan range ... Hore !:
atau menghitung mundur 10:
Kutipan dari Bash 5 Man Page :
Inilah solusi saya untuk Bash 4. Ini menghapus secara berulang entri tunggal atau rentang sejarah dimulai dengan indeks terendah.
sumber
Menggabungkan jawaban dari atas:
history -w vi ~/.bash_history history -r
sumber
edit:
Mengubah iterator yang diperkuat, panggilan bagus. Juga, panggil fungsi ini dengan iterator terbalik.
Anda mungkin dapat melakukan sesuatu seperti ini:
Di mana Anda akan membangkitkan seperti ini:
Perhatikan Saya belum memasukkan kesalahan saat memeriksa batas. Saya akan meninggalkan itu sebagai latihan untuk pembaca.
lihat juga pertanyaan ini
sumber
seq 563 514
tidak akan mencetak apa pun. Kamu butuhseq 563 -1 514
. Sebagai alternatif, Anda cukup menggunakanhistory -d $1
argumen sebagai514 563
Mungkin akan bermanfaat bagi seseorang.
Ketika Anda login ke pengguna manapun dari konsol / terminal riwayat sesi Anda saat ini hanya ada di beberapa "buffer" yang flushes ke ~ / .bash_history pada logout Anda.
Jadi, untuk merahasiakannya, Anda bisa:
history -r && exit
dan Anda akan keluar dengan riwayat semua sesi Anda (dan hanya);)
sumber
Saya menggunakan kombinasi solusi yang dibagikan di utas ini untuk menghapus jejak dalam sejarah perintah. Pertama, saya memverifikasi di mana riwayat perintah tersimpan dengan:
Saya mengedit sejarah dengan:
Setelah itu, saya membersihkan buffer riwayat sesi saat ini dengan:
Lain kali Anda masuk ke sesi ini, perintah terakhir yang akan Anda lihat pada sejarah perintah adalah yang terakhir yang Anda tinggalkan di pathToFile .
sumber
history -c akan menghapus semua histori.
sumber
untuk menghapus 10 entri terakhir (berdasarkan pada contoh Anda):
sumber
Saya menggunakan skrip ini untuk menghapus 10 perintah terakhir dalam sejarah:
Ia menggunakan
$HISTCMD
lingkungan var untuk mendapatkan indeks riwayat dan menggunakannya untuk menghapus 10 entri terakhir dihistory
.sumber
Coba yang berikut ini:
sumber
for i in {511..520}; do history -d $i; echo "history -d 511"; done
Saya menggunakan ini (saya memiliki bash 4):
Itu
builtin history
bagian serta yang terakhir-w
adalah karena saya memiliki variasi trik terkenal untuk berbagi sejarah di terminal dan fungsi ini akan pecah tanpa bagian-bagian itu. Mereka memastikan panggilan ke pesta nyatahistory
bawaan yang (dan bukan ke pembungkus saya sendiri di sekitarnya), dan untuk menulis sejarah ke HISTFILE segera setelah entri dihapus.Namun ini akan berfungsi sebagaimana halnya dengan konfigurasi riwayat "normal".
Anda harus memanggilnya dengan jumlah entri terakhir yang ingin Anda hapus, misalnya:
Akan menghapus 10 entri terakhir.
sumber
Brute tapi fungsional
sumber
Jika Anda ingin menghapus 10 baris maka ubah saja nilai N menjadi 10.
sumber
Fungsi sederhana dapat membunuh semua dengan nomor (meskipun itu kesalahan pada kesalahan)
sumber
Pendek tapi manis:
for i in {1..10}; do history -d $(($HISTCMD-11)); done
sumber