Jawaban 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):
history | tail -n 10
Ini memberi saya sesuatu seperti
1003 25-04-2016 17:54:52 echo "Command 1"
1004 25-04-2016 17:54:54 echo "Command 2"
1005 25-04-2016 17:54:57 echo "Command 3"
1006 25-04-2016 17:54:59 echo "Command 4"
1007 25-04-2016 17:55:01 echo "Command 5"
1008 25-04-2016 17:55:03 echo "Command 6"
1009 25-04-2016 17:55:07 echo "Command 7"
1010 25-04-2016 17:55:09 echo "Command 8"
1011 25-04-2016 17:55:11 echo "Command 9"
1012 25-04-2016 17:55:14 echo "Command 10"
Pilih posisi awal dan akhir untuk item yang ingin Anda hapus. Saya akan menghapus entri 1006 hingga 1008.
for h in $(seq 1006 1008); do history -d 1006; done
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):
history 1 | awk '{print $1}'
Menyatukannya Anda dapat menggunakan ini untuk menghapus rentang, dan juga menghapus perintah hapus riwayat:
for h in $(seq 1006 1008); do history -d 1006; done; history -d $(history 1 | awk '{print $1}')
Bungkus semuanya dalam fungsi untuk ditambahkan ke ~/.bashrc
:
histdel(){
for h in $(seq $1 $2); do
history -d $1
done
history -d $(history 1 | awk '{print $1}')
}
Contoh menghapus perintah 4, 5 dan 6 (1049-1051) dan menyembunyikan bukti:
[18:21:02 jonathag@gb-slo-svb-0221 ~]$ history 11
1046 25-04-2016 18:20:47 echo "Command 1"
1047 25-04-2016 18:20:48 echo "Command 2"
1048 25-04-2016 18:20:50 echo "Command 3"
1049 25-04-2016 18:20:51 echo "Command 4"
1050 25-04-2016 18:20:53 echo "Command 5"
1051 25-04-2016 18:20:54 echo "Command 6"
1052 25-04-2016 18:20:56 echo "Command 7"
1053 25-04-2016 18:20:57 echo "Command 8"
1054 25-04-2016 18:21:00 echo "Command 9"
1055 25-04-2016 18:21:02 echo "Command 10"
1056 25-04-2016 18:21:07 history 11
[18:21:07 jonathag@gb-slo-svb-0221 ~]$ histdel 1049 1051
[18:21:23 jonathag@gb-slo-svb-0221 ~]$ history 8
1046 25-04-2016 18:20:47 echo "Command 1"
1047 25-04-2016 18:20:48 echo "Command 2"
1048 25-04-2016 18:20:50 echo "Command 3"
1049 25-04-2016 18:20:56 echo "Command 7"
1050 25-04-2016 18:20:57 echo "Command 8"
1051 25-04-2016 18:21:00 echo "Command 9"
1052 25-04-2016 18:21:02 echo "Command 10"
1053 25-04-2016 18:21:07 history 11
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.
histdeln(){
# Get the current history number
n=$(history 1 | awk '{print $1}')
# Call histdel with the appropriate range
histdel $(( $n - $1 )) $(( $n - 1 ))
}
Fungsi ini membutuhkan 1 argumen, jumlah item riwayat sebelumnya untuk dihapus. Jadi untuk menghapus 10 perintah terakhir dari riwayat cukup gunakan histdeln 10
.
vi $HISTFILE
dan hapus yang Anda inginkan. Gunakanhead -n -10
jika Anda harus mengotomatiskannya.