Làm thế nào để loại bỏ một dòng duy nhất từ ​​lịch sử?


Câu trả lời:


339

Biện pháp phòng ngừa

Nếu bạn muốn chạy một lệnh mà không lưu nó trong lịch sử, hãy thêm nó vào một khoảng trống thừa

prompt$ echo saved
prompt$  echo not saved \
> #     ^ extra space

Để làm việc này, bạn cần ignorespacehoặc ignorebothtrong HISTCONTROL. Ví dụ: chạy

HISTCONTROL=ignorespace

Để làm cho thiết lập này liên tục, đặt nó trong của bạn .bashrc.

Dọn dẹp sau khi chết

Nếu bạn đã chạy lệnh và muốn xóa nó khỏi lịch sử, trước tiên hãy sử dụng

history

để hiển thị danh sách các lệnh trong lịch sử của bạn. Tìm số bên cạnh số bạn muốn xóa (ví dụ: 1234) và chạy

history -d 1234

Ngoài ra, nếu dòng bạn muốn xóa đã được ghi vào $ HISTFILE của bạn (điều này thường xảy ra khi bạn kết thúc một phiên theo mặc định), bạn sẽ cần phải viết lại cho $ HISTFILE, hoặc dòng sẽ xuất hiện lại khi bạn mở mới phiên:

history -w

Nó đã làm việc. Tôi nghĩ rằng chúng ta cần nguồn ~ / .bashrc sau khi sửa đổi nó ...
B Bảy

3
@ jw013 Tôi đặt PROMPT_COMMAND thành history -a, trong trường hợp đó, nó đã được ghi vào tệp lịch sử, thay vì thoát theo cấu hình bình thường. Cụ thể: mywiki.wooledge.org/BashFAQ/088
jordanm

5
Sau khi xóa một dòng duy nhất, bạn cần viết ra lịch sử hiện tại vào $ HISTFILE của mình bằng cách sử dụng history -w. Nếu không, khi bạn thoát, dòng đã xóa vẫn còn đó!
Felipe Alvarez

1
+1 cho nhận xét trên; sử dụng history -wsau history -d {num}đó chính xác là những gì tôi cần - cần thêm câu trả lời quan trọng vào câu trả lời, nếu không, người dùng có thể nghĩ rằng việc xóa tạm thời khỏi trình bao hiện tại là thực sự vĩnh viễn.
michael

1
@BobStein history -wlà cần thiết cho các mục đã được ghi vào .bash_historytệp. Cách sao chép (ví dụ: trên CentOS 7 với cấu hình chứng khoán): 1. đăng nhập 2. nhập lệnh echo foo3. đăng xuất 4. đăng nhập lại 5. xóa mục nhập cho echo foo6. đăng xuất 7. đăng nhập lại: mục vẫn còn đó. Tùy thuộc vào cách bạn định cấu hình lịch sử bash của mình, có lẽ bạn có thể tái tạo vấn đề này theo những cách khác - tức là nếu bạn kích thích viết lịch sử trước khi đăng xuất.
maxschlepzig

53
  1. Để xóa tất cả lịch sử của bạn, sử dụng

    history -c
  2. Để xóa một dòng, sử dụng

    history -d linenumber

6

Tôi có cái này trong ~/.bashrcđó, làm cho lệnh $ forgetxóa lệnh trước đó khỏi lịch sử

function forget() {                                                              
   history -d $(expr $(history | tail -n 1 | grep -oP '^ \d+') - 1);              
}

Điều đó có vẻ hơi phức tạp. Sẽ không history -d $( history | tail -n 1 | cut -f 1 -d " " )đơn giản hơn?
seumasmac

1
history | tail -n1historychính lệnh, vì vậy xóa số đó nhận được mục sai. Tuy nhiên, history -d $( history | awk 'END{print $1-1}' )kết hợp chọn dòng, chọn trường và trừ.
dave_thndry_085

Bất kỳ cơ hội nào ai đó có thể giúp đỡ với portin này để zshell?
Alex S

6

Bạn luôn có thể chỉnh sửa và xóa các mục từ ~/.bash_history, hữu ích khi bạn muốn xóa một mục nhập hoặc nhiều mục nhập


2
Nhiều khả năng những mục này sẽ được giới thiệu lại khi bạn thoát khỏi trình bao.
l0b0

5

Nếu bạn muốn quên toàn bộ phiên bash, bạn có thể killxử lý bash hiện tại. Vì biến $$giữ pidvỏ hiện tại, bạn có thể làm:

kill -9 $$

1

Bạn cần viết những thay đổi sau khi bạn xóa lịch sử. Và nếu bạn không muốn có lệnh xóa lịch sử trong lịch sử của mình thì bạn cần chạy lệnh như thế:

history -c && history -w && logout

Chúc may mắn.


-1
Adding another point suppose if you want to delete a range of history lines

You can use below script. 

Below example will delete history output from line 1 to line 150.

for i in `history | awk 'NR > 1 && NR <=150{print   $1}'`; do history -d $i; done
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.