Làm thế nào để xóa kết quả được chọn từ lịch sử bash?


66

historylệnh hiển thị tất cả các kết quả nhưng chúng ta có thể lọc để nhận lệnh cụ thể bằng cách sử dụng history | grep searchingCommand. Nó thực sự hữu ích.

Nhưng vấn đề là nó cho thấy những lệnh đó cũng được nhập với lỗi đánh máy hoặc không thành công. Sau đó, xác định đúng là một nỗi đau. Tôi đã kiểm tra liên kết này: Lịch sử lệnh chọn lọc trong thiết bị đầu cuối? nhưng đó không phải là giải pháp của tôi

Vì vậy, có cách nào để xóa các lệnh đó khỏi lịch sử không chính xác tại thời điểm nhập hoặc sau này không?


5
Xin vui lòng, thay đổi câu trả lời được chấp nhận, có khác với hơn 100 phiếu bầu.
chào

1
@greuze: Thay đổi thành câu trả lời hay nhất. Số phiếu không có nghĩa là tốt nhất!
Saurav Kumar

Câu trả lời:


20

Tôi muốn thêm một phương pháp sửa đổi (hoặc xóa) các mục lịch sử mà tôi thấy khá tình cờ khi tôi làm việc với bash:

Để chứng minh điều này, hãy bắt đầu bằng cách thực hiện ba lệnh sau trong bash:

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

Bây giờ bạn có thể chọn lại các lệnh này bằng các phím mũi tên hoặc Ctrl+ pCtrl+ n.

Nói rằng bạn muốn sửa đổi hai lệnh đầu tiên. Di chuyển qua lịch sử cho đến khi echo 1xuất hiện và thay đổi nó thành echo 1 - changed, nhưng KHÔNG ĐƯỢC BÁO CHÍ. Nếu bây giờ bạn di chuyển xa hơn trong lịch sử của mình, dòng này vẫn ở trạng thái được sửa đổi và bạn có thể di chuyển khỏi và quay lại nó. Bây giờ di chuyển đến dòng echo 2và thay đổi nó thành echo 2 - changed, một lần nữa đừng nhấn enter. Để lưu các thay đổi đối với các dòng này, hãy chọn bất kỳ lệnh nào trong lịch sử ngoại trừ hai dòng này và nhấn Ctrl+ c.

Tất nhiên, thay vì sửa đổi mục lịch sử, bạn cũng có thể xóa mục đó sẽ dẫn đến một dòng trống ở mục đó. Để xóa dòng hiện đang hiển thị tại dấu nhắc, nhấn Ctrl+ e(nhảy đến cuối dòng) theo sau là Ctrl+ u(xóa văn bản từ đầu dòng đến con trỏ).

Xem thêm https://unix.stackexchange.com/questions/195668/what-can-cause-an-item-to-be-delatted-from-my-bash-history/195726#195726 để được giải thích chi tiết hơn về nền tảng kỹ thuật.

Cách đơn giản nhất:

  1. ctrl+ rđể tìm kiếm lệnh bạn muốn xóa / sửa đổi.
  2. end để chọn lệnh tìm kiếm để xóa / sửa đổi
  3. Xóa hoặc sửa đổi lệnh đã chọn (không nhấn enterhoặc ctrl+ c)
  4. mũi tên lên (hoặc ctrl+ p) hoặc mũi tên xuống (hoặc ctrl+ n) để chọn bất kỳ lệnh nào khác.
  5. ctrl+ c Thế thôi!

Lưu ý :

Điều này chỉ thay đổi các lệnh phiên hiện tại. Nếu chúng ta muốn thay đổi các lệnh cũ hơn và lưu các thay đổi, chúng ta cần chạy lệnh sau trước khi đóng terminal:

history -w

Rất cám ơn Stefan! Tôi phải nói rằng bạn đã mang đến một điều tuyệt vời. Sử dụng điều này tôi tìm thấy cách đơn giản nhất để sửa đổi / xóa lịch sử: 1.ctrl+r để tìm kiếm lệnh bạn muốn xóa / sửa đổi. 2.end để di chuyển lệnh và xóa / sửa đổi lệnh. 3.ctrl+n để đi đến dòng tiếp theo và sau đó 4.ctrl+c
Saurav Kumar

144

Sử dụng:

history -d OFFSET

để xóa mục lịch sử tại offset OFFSETngay cả trước khi nó được thêm vào tệp lịch sử bash của bạn. Để tìm ra quyền OFFSET, bạn chỉ cần chạy historylệnh. Đó là số từ đầu dòng chứa mục nhập lịch sử mà bạn muốn xóa.

Và để lưu các sửa đổi cho lịch sử sử dụng:

history -w

Xem thêm chi tiết trong hướng dẫn này .


không tệ :) Tốt để có một cách mới ..
Saurav Kumar

10
@SauravKumar Không tệ?!? Có lẽ là cách tốt nhất ...
Radu Rădeanu

5
ĐỌC ĐẦU TIÊN: Để rõ ràng, bạn phải thực hiện các history -wlời bạt để lưu các thay đổi. Ngoài ra OFFSET có nghĩa là số nào historyhiển thị. Nếu dòng bạn đang cố xóa là 873 thì hãy sử dụng history -d 873.
Cammy_the_block

2
@ RaduRădeanu Sử dụng history -wsau history -dđể lưu thay đổi.
Cammy_the_block

20
Đây phải là câu trả lời chính xác.
topher

19

Chỉnh sửa tập tin ~/.bash_historyvà xóa một lần với lỗi chính tả

Ví dụ: chèn lệnh này:

gedit ~/.bash_history

Chỉnh sửa một cái gì đó bạn thích và sau đó lưu tệp và khởi động lại thiết bị đầu cuối. Lệnh gốc là:

sudo -i 
inser your password
gedit ~/.bash_history

Nếu bạn muốn xóa tất cả history -cthì nên thực hiện thủ thuật


Đồng bộ

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

CHÌA KHÓA

-c Xóa danh sách lịch sử. Điều này có thể được kết hợp với các tùy chọn khác để thay thế hoàn toàn danh sách lịch sử.

-d offset Xóa mục nhập lịch sử tại vị trí offset. offset phải được chỉ định khi nó xuất hiện khi lịch sử được hiển thị.

-a Nối các dòng lịch sử mới (các dòng lịch sử được nhập từ đầu phiên Bash hiện tại) vào tệp lịch sử.

-n Nối các dòng lịch sử chưa được đọc từ tệp lịch sử vào danh sách lịch sử hiện tại. Đây là những dòng được nối vào tệp lịch sử kể từ đầu phiên Bash hiện tại.

-r Đọc tệp lịch sử hiện tại và thêm nội dung của nó vào danh sách lịch sử.

-w Viết ra lịch sử hiện tại vào tập tin lịch sử.

-p Thực hiện thay thế lịch sử trên các đối số và hiển thị kết quả trên đầu ra tiêu chuẩn, mà không lưu trữ các kết quả trong danh sách lịch sử.

-s Các đối số được thêm vào cuối danh sách lịch sử dưới dạng một mục duy nhất.

nguồn :


Cảm ơn nó rất hữu ích! Bạn có biết làm thế nào để xóa mục nhập tại thời điểm khi nhập từ dòng lệnh? Hoặc có bất kỳ lệnh nào để xóa mục mà không cần mở .bash_history?
Saurav Kumar

1
@ bladed19899 history -ckhông hoạt động Khi tôi đóng thiết bị đầu cuối và mở lại, lịch sử không bị xóa. -1 câu trả lời của bạn
asнι

1
@KasiyA, -c Clear the history list. This may be combined with the other options to replace the history list completely. nguồn
blade19899

2
@KasiyA Sử dụng history -wsau history -cđể viết các thay đổi.
Cammy_the_block

16

Nếu bạn muốn xóa nó ngay lập tức cùng một thiết bị đầu cuối, trước tiên bạn phải thêm phần sau vào tệp ~ / .bashrc của mình.

PROMPT_COMMAND='history -a' 

khởi động lại thiết bị đầu cuối của bạn.

Bạn có thể thêm nó vào bất cứ đâu trong tệp .bashrc. Tôi đã thêm như dưới đây cùng với các nội dung liên quan đến lịch sử khác.

nhập mô tả hình ảnh ở đây

Thông thường trong một phiên bash, các lệnh được thực thi không được ghi vào .bash_history cho đến khi phiên kết thúc do đó PROMPT_COMMAND='history -a'nhập lệnh sau đó vào đó .bash_history.

Bây giờ bất cứ khi nào bạn mắc lỗi hoặc lỗi trong một lệnh và muốn xóa nó sau đó, chỉ cần thực hiện như sau

sed -i '$d' ~/.bash_history

và tada nó sẽ bị xóa.

Để làm cho nó đơn giản hơn, bạn có thể đặt bí danh cho một cái gì đó đơn giản hơn và sử dụng nó như

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

Vì vậy, thực thi rhsẽ loại bỏ lệnh thực hiện cuối cùng khỏi lịch sử.

Trên đây là răng cưa tạm thời chỉ tồn tại trong một phiên. Để làm cho nó thêm vĩnh viễn hoặc liên tục

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

đến .bashrc

GHI CHÚ

Không nên có bất kỳ khoảng trống nào ở cả hai phía của =

Nếu bạn không muốn bí danh thì bạn cũng có thể làm như sau

Tạo một tên commad rhvà đặt nó trong /binthư mục:

  • Mở một tập tin nói rhvà dán mã sau đây, lưu và đóng:

    sed -i '$d' ~/.bash_history

  • Thực hiện rhvà đặt nó trong /binthư mục:

     chmod + x rh
     sudo cp rh / bin 
  • Bây giờ sử dụng rhlệnh để xóa lệnh gần đây khỏi lịch sử.


Nơi để thêm PROMPT_COMMAND='history -a'vào .bashrctập tin? Và chính xác nó sẽ làm gì? Tôi đã thử sed -i '$d' ~/.bash_historynó hoạt động mà không cần chỉnh sửa .bashrc!! Nhưng điều bí danh không hoạt động .. Tôi sẽ chấp nhận câu trả lời của bạn nếu bạn chỉ giải thích câu hỏi của tôi và làm cho bí danh hoạt động .. :)
Saurav Kumar

@SauravKumar đã chỉnh sửa câu trả lời. Đã bỏ lỡ các trích dẫn đơn và kép trong lệnh răng cưa .. Xấu của tôi ..: P
Stormvirux

Tin tôi đi hay không .. điều bí danh vẫn không hoạt động .. Nó thực thi không có lỗi nhưng không xóa mục nhập khỏi .bash_historytệp ..: P bằng mọi cách .. Không phải là vấn đề .. Tôi đã thực hiện lệnh của riêng mình và đặt nó vào /bindanh mục. Vì lệnh của bạn: sed -i "$d" ~/.bash_historynó hoạt động tốt. Tôi chấp nhận câu trả lời của bạn .. :)
Saurav Kumar

Nếu bạn không phiền, tôi muốn chỉnh sửa câu trả lời của bạn để nó hữu ích cho người khác ..
Saurav Kumar

Thật ra tôi đã chỉnh sửa nó. Bạn đã chấp thuận nó ..
Saurav Kumar

2

để xóa nhiều dòng (ví dụ: từ 1974 đến 1990, hãy kiểm tra bằng historylệnh):

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

lưu ý rằng số dòng cần loại bỏ luôn giống nhau, vì bạn liên tục xóa số đó và chuyển sang dòng tiếp theo.


Các lưu ý là rất quan trọng.
Weijun Zhou

1

Nếu bạn đang sử dụng tùy chọn "set -o vi" trong bash (rất hữu ích để tìm kiếm lại bằng phím Escape), thì bạn có thể tìm kiếm dòng và xóa dòng bằng "dd" giống như cách bạn làm trong "vi".


Tôi thấy rằng tôi phải gõ jhoặc ksau ddđể làm cho nó thực sự xóa lệnh khỏi lịch sử. Nếu tôi gõ một lệnh khác, hoặc chỉ nhấn Enter, bash dường như cho rằng đó chỉ là một lệnh mới và nó sẽ giữ lại lệnh cũ trong lịch sử. Cũng thật thú vị khi lưu ý rằng khi nó được thực hiện đúng, nó sẽ xóa lệnh, nhưng không xóa nó. Kết quả là các mục lịch sử trống. Nhưng điều này là đủ tốt để xóa mật khẩu mà tôi buộc phải gõ vào dòng lệnh, và dễ dàng hơn nhiều so với các câu trả lời khác, vì vậy cảm ơn rất nhiều vì đã đăng bài này!
Michael Scheper

0

Tôi đã có một tình huống mà tôi đã có những mục không cần thiết trong lịch sử bash của mình từ một Yubikey - có thể khoảng 50 hoặc hơn, phù hợp với 'ccccc .....'. Lý tưởng nhất, tôi muốn có một cách để xóa các mục khớp với một mẫu, mà tôi cho rằng bạn có thể làm với sed hoặc một cái gì đó, giả sử lịch sử của bạn bỏ qua khoảng trống.

Dù sao, tôi đã lười biếng và cuối cùng đã sử dụng vim, tìm kiếm 'cccc' và sử dụng 'dd' trong khi đạp xe qua mọi trận đấu. Không mất hơn một phút.


1
Nếu bạn đang làm điều này trong vim thì bạn cũng có thể làm: g / cccc / d hoặc: g / ^ cccc / d: hoặc sử dụng macro qqnddq sau đó @@ (giả sử tìm kiếm cuối cùng của bạn là ccccc).
htaccess

@htaccess Điều đó chắc chắn sẽ dễ dàng hơn, nhưng tôi muốn kiểm tra trực quan phần còn lại của tập tin cùng một lúc.
Dylan_Larkin
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.