Bagaimana cara menghapus hasil yang dipilih dari bash history?

66

historyperintah menunjukkan semua hasil tetapi kita bisa memfilter untuk mendapatkan perintah tertentu menggunakan history | grep searchingCommand. Ini sangat membantu.

Tetapi masalahnya adalah itu menunjukkan perintah-perintah itu juga yang dimasukkan dengan kesalahan ketik atau yang tidak berhasil. Maka mengidentifikasi yang benar benar-benar menyebalkan. Saya memeriksa tautan ini: Sejarah perintah selektif di terminal? tapi itu bukan solusi saya.

Jadi adakah cara untuk menghapus perintah-perintah itu dari sejarah yang tidak benar pada saat dimasukkan atau nanti?

Saurav Kumar
sumber
5
Tolong, ubah jawaban yang diterima, ada yang lain dengan lebih dari 100 suara.
greuze
1
@greuze: Diubah ke jawaban terbaik. Hitungan suara tidak berarti itu yang terbaik!
Saurav Kumar

Jawaban:

20

Saya ingin menambahkan metode lain untuk memodifikasi (atau menghapus) entri riwayat, yang saya temukan secara tidak sengaja ketika saya bekerja dengan bash:

Untuk mendemonstrasikan ini, mulailah dengan menjalankan tiga perintah berikut dalam bash:

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

Anda sekarang dapat memilih perintah ini lagi menggunakan tombol panah atau Ctrl+ pdan Ctrl+ n.

Katakanlah Anda ingin memodifikasi dua perintah pertama. Pindahkan riwayat hingga echo 1muncul dan ubah ke echo 1 - changed, tetapi JANGAN PRESS ENTER. Jika sekarang Anda bergerak lebih jauh melalui riwayat Anda, baris ini tetap dalam kondisi yang dimodifikasi dan Anda dapat menjauh dari dan kembali ke sana. Sekarang pindah ke baris echo 2dan ubah ke echo 2 - changed, sekali lagi jangan tekan enter. Untuk menyimpan perubahan pada baris-baris ini, pilih perintah apa saja di histori kecuali untuk keduanya, dan tekan Ctrl+ c.

Tentu saja, alih-alih mengubah entri riwayat, Anda juga dapat menghapusnya yang akan menghasilkan baris kosong pada entri itu. Untuk menghapus baris yang saat ini ditampilkan pada prompt, tekan Ctrl+ e(yang melompat ke akhir baris) diikuti oleh Ctrl+ u(yang menghapus teks dari awal baris ke kursor).

Lihat juga https://unix.stackexchange.com/questions/195668/what-can-cause-an-item-to-be-deleted-from-my-bash-history/195726#195726 untuk penjelasan lebih rinci tentang latar belakang teknis.

Cara termudah:

  1. ctrl+ runtuk mencari perintah yang ingin Anda hapus / ubah.
  2. end untuk memilih perintah yang dicari untuk menghapus / memodifikasi
  3. Hapus atau modifikasi perintah yang dipilih (jangan tekan enteratau ctrl+ c)
  4. panah atas (atau ctrl+ p) atau panah bawah (atau ctrl+ n) untuk memilih perintah lain.
  5. ctrl+ c Itu dia!

Catatan :

Ini hanya mengubah perintah sesi saat ini. Jika kita ingin mengubah perintah lama dan menyimpan perubahan kita perlu menjalankan perintah berikut sebelum menutup terminal:

history -w
Stefan Hamcke
sumber
Terima kasih banyak Stefan! Saya harus mengatakan bahwa Anda membawa hal-hal yang luar biasa. Menggunakan ini, saya menemukan cara paling sederhana untuk memodifikasi / menghapus histori: 1.ctrl+r untuk mencari perintah yang ingin Anda hapus / modifikasi. 2.end untuk memindahkan perintah dan menghapus / memodifikasi perintah. 3.ctrl+n untuk pergi ke baris berikutnya dan kemudian 4.ctrl+c
Saurav Kumar
144

Menggunakan:

history -d OFFSET

untuk menghapus entri riwayat di offset OFFSETbahkan sebelum ditambahkan ke file riwayat bash Anda. Untuk menemukan yang benar OFFSET, Anda hanya perlu menjalankan historyperintah. Ini adalah nomor dari awal baris yang berisi entri riwayat yang ingin Anda hapus.

Dan untuk menyimpan modifikasi gunakan riwayat:

history -w

Lihat lebih detail dalam panduan ini .

pengguna299481
sumber
tidak buruk :) Bagus untuk mendapatkan cara baru ..
Saurav Kumar
10
@SauravKumar Tidak buruk?!? Mungkin adalah cara terbaik ...
Radu Rădeanu
5
BACA PERTAMA: Agar jelas Anda harus melakukan history -wkata penutup untuk menyimpan perubahan. Juga OFFSET berarti nomor mana yang historyditampilkan. Jika baris yang Anda coba hapus adalah 873 maka gunakan history -d 873.
Cammy_the_block
2
@ RaduRădeanu Gunakan history -wsetelah history -duntuk menyimpan perubahan.
Cammy_the_block
20
Ini seharusnya jawaban yang benar.
topher
19

Edit file ~/.bash_historydan hapus sekali dengan salah ketik

Misalnya, masukkan perintah ini:

gedit ~/.bash_history

Edit sesuatu yang Anda sukai dan setelah daripada menyimpan file dan restart terminal. Perintah root adalah:

sudo -i 
inser your password
gedit ~/.bash_history

jika ingin menghapus semua history -charus melakukan trik


SINTAKSIS

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

KUNCI

-c Bersihkan daftar riwayat. Ini dapat dikombinasikan dengan opsi lain untuk mengganti daftar riwayat sepenuhnya.

-d offset Menghapus entri riwayat pada offset posisi. offset harus ditentukan seperti yang muncul ketika histori ditampilkan.

-a Tambahkan baris histori baru (baris histori yang dimasukkan sejak awal sesi Bash saat ini) ke file histori.

-n Tambahkan baris sejarah yang belum dibaca dari file riwayat ke daftar riwayat saat ini. Ini adalah baris yang ditambahkan ke file histori sejak awal sesi Bash saat ini.

-r Baca file riwayat saat ini dan tambahkan kontennya ke daftar riwayat.

-w Tuliskan riwayat saat ini ke file riwayat.

-p Lakukan subtitusi histori pada args dan tampilkan hasilnya pada output standar, tanpa menyimpan hasilnya dalam daftar histori.

-s Args ditambahkan ke akhir daftar riwayat sebagai satu entri.

sumber :

blade19899
sumber
Terima kasih itu sangat membantu! Apakah Anda tahu cara menghapus entri pada saat dimasukkan dari baris perintah? Atau adakah perintah untuk menghapus entri tanpa membuka .bash_history?
Saurav Kumar
1
@ bladed19899 history -ctidak berfungsi Ketika saya menutup terminal dan membukanya lagi, sejarah tidak terhapus. -1 jawaban Anda
αғsнιη
1
@KasiyA, -c Clear the history list. This may be combined with the other options to replace the history list completely. sumber
blade19899
2
@KasiyA Gunakan history -wsetelah history -cmenulis perubahan.
Cammy_the_block
16

Jika Anda ingin segera menghapusnya dari terminal yang sama terlebih dahulu Anda harus menambahkan yang berikut ke file ~ / .bashrc Anda.

PROMPT_COMMAND='history -a' 

dan restart terminal Anda.

Anda dapat menambahkannya di mana saja dalam file .bashrc. Saya telah menambahkan seperti di bawah ini bersama dengan hal-hal terkait sejarah lainnya.

masukkan deskripsi gambar di sini

Biasanya selama sesi bash, perintah yang dieksekusi tidak ditulis ke dalam .bash_history sampai sesi diakhiri maka PROMPT_COMMAND='history -a'masukkan perintah lalu ke sana ke dalam .bash_history.

Sekarang setiap kali Anda membuat kesalahan atau kesalahan dalam suatu perintah dan ingin menghapusnya saat itu juga jalankan saja yang berikut ini

sed -i '$d' ~/.bash_history

dan tada itu akan dihapus.

Untuk membuatnya lebih sederhana, Anda dapat alias untuk sesuatu yang lebih sederhana dan menggunakannya seperti

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

Jadi mengeksekusi rhakan menghapus perintah yang dieksekusi terakhir dari sejarah.

Di atas adalah alias sementara yang hanya berlangsung selama satu sesi. Untuk membuatnya permanen atau terus-menerus ditambahkan

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

ke .bashrc

CATATAN

Seharusnya tidak ada ruang di kedua sisi =

Jika Anda Tidak Ingin Alias ​​maka Anda juga bisa melakukan hal berikut

Buat nama commad rhdan letakkan di /bindirektori:

  • Buka file say rhdan rekatkan kode berikut, simpan dan tutup:

    sed -i '$d' ~/.bash_history

  • Jadikan rhexecutable dan letakkan di /bindirektori:

     chmod + x rh
     sudo cp rh / bin 
  • Sekarang gunakan rhperintah untuk menghapus perintah terbaru dari riwayat.

Stormvirux
sumber
Dimana untuk menambahkan PROMPT_COMMAND='history -a'di .bashrcberkas? Dan apa tepatnya yang akan dilakukannya? Saya mencoba sed -i '$d' ~/.bash_historyini berfungsi tanpa mengedit .bashrc!! Tapi alias hal itu tidak berfungsi .. Saya akan menerima jawaban Anda jika Anda hanya menguraikan pertanyaan saya dan membuat alias berfungsi .. :)
Saurav Kumar
@SauravKumar telah mengedit jawabannya. Telah melewatkan tanda kutip tunggal dan ganda dalam perintah aliasing .. Buruk saya ..: P
Stormvirux
Percayalah atau tidak .. alias masih tidak berfungsi .. Eksekusi tanpa kesalahan tetapi tidak menghapus entri dari .bash_historyfile ..: P apa pun .. Tidak masalah .. Saya membuat perintah sendiri dan meletakkannya di /bindirektori. Karena karena perintah Anda: sed -i "$d" ~/.bash_historyitu berfungsi dengan baik. Saya menerima jawaban Anda .. :)
Saurav Kumar
Jika Anda tidak keberatan, saya ingin mengedit jawaban Anda sehingga akan membantu orang lain ..
Saurav Kumar
Sebenarnya saya sudah mengeditnya. Anda harus menyetujuinya ..
Saurav Kumar
2

untuk menghapus beberapa baris (mis. dari 1974 hingga 1990, periksa dengan historyperintah):

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

perhatikan bahwa nomor baris yang akan dihapus selalu sama, karena Anda menghapus yang terus-menerus dan pergi ke yang berikutnya.

törzsmókus
sumber
Catatan itu sangat penting.
Weijun Zhou
1

Jika Anda menggunakan opsi "set -o vi" di bash (sangat berguna untuk mencari kembali dengan tombol Escape), maka Anda dapat mencari baris dan menghapus baris dengan "dd" dengan cara yang sama seperti yang Anda lakukan di "vi".

Orang ITU
sumber
Saya menemukan bahwa saya harus mengetik jatau ksetelah ddmembuatnya benar-benar menghapus perintah dari sejarah. Jika saya mengetik perintah lain, atau cukup tekan Enter, bash tampaknya menganggap itu hanya perintah baru dan itu harus mempertahankan perintah lama dalam sejarah. Menarik juga untuk dicatat bahwa ketika dilakukan dengan benar, perintah akan dihapus, tetapi tidak menghapusnya — hasilnya adalah entri riwayat kosong. Tapi ini cukup bagus untuk menghapus kata sandi yang terpaksa saya ketik di baris perintah, dan jauh lebih mudah daripada jawaban lain, jadi terima kasih banyak untuk memposting ini!
Michael Scheper
0

Saya memiliki situasi di mana saya memiliki entri berlebihan dalam sejarah bash saya dari Yubikey - mungkin 50 atau lebih, cocok dengan 'ccccc .....'. Idealnya, saya ingin cara menghapus entri yang cocok dengan pola, yang saya kira bisa Anda lakukan dengan sed atau sesuatu, dengan asumsi riwayat Anda mengabaikan kosong.

Lagi pula, saya malas dan akhirnya menggunakan vim, mencari 'cccc' dan menggunakan 'dd' saat bersepeda di setiap pertandingan. Tidak perlu lebih dari satu menit.

Dylan_Larkin
sumber
1
Jika Anda melakukan ini dalam vim maka Anda juga bisa melakukan: g / cccc / d atau: g / ^ cccc / d: atau menggunakan qqnddq makro lalu @@ (menganggap pencarian terakhir Anda adalah untuk ccccc).
htaccess
@ Htaccess Itu pasti akan lebih mudah, tapi saya agak ingin secara visual memeriksa sisa file pada saat yang sama.
Dylan_Larkin