Câu trả lời của tôi dựa trên các câu trả lời trước đó, nhưng với việc bổ sung đảo ngược trình tự để các mục lịch sử bị xóa từ gần đây nhất đến gần đây nhất.
Nhận lịch sử hiện tại của bạn (điều chỉnh số lượng dòng bạn muốn xem):
history | tail -n 10
Điều này mang lại cho tôi một cái gì đó như
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"
Chọn vị trí bắt đầu và kết thúc cho các mục bạn muốn xóa. Tôi sẽ xóa các mục 1006 đến 1008.
for h in $(seq 1006 1008); do history -d 1006; done
Điều này sẽ tạo ra history -d
các lệnh cho 1006, sau đó 1007 trở thành 1006 và 1006 bị xóa, sau đó 1008 (trở thành 1007) bây giờ là 1006 và bị xóa.
Nếu tôi cũng muốn xóa lệnh xóa lịch sử thì nó phức tạp hơn một chút vì bạn cần biết mục lịch sử tối đa hiện tại.
Bạn có thể có được điều này với (có thể có một cách tốt hơn):
history 1 | awk '{print $1}'
Đặt nó lại với nhau, bạn có thể sử dụng điều này để xóa một phạm vi và cũng xóa lệnh xóa lịch sử:
for h in $(seq 1006 1008); do history -d 1006; done; history -d $(history 1 | awk '{print $1}')
Gói tất cả trong một chức năng để thêm vào ~/.bashrc
:
histdel(){
for h in $(seq $1 $2); do
history -d $1
done
history -d $(history 1 | awk '{print $1}')
}
Ví dụ xóa lệnh 4, 5 và 6 (1049-1051) và ẩn bằng chứng:
[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
Câu hỏi thực sự là xóa 10 lệnh cuối cùng khỏi lịch sử, vì vậy nếu bạn muốn tiết kiệm một chút nỗ lực, bạn có thể sử dụng một hàm khác để gọi histdel
hàm thực hiện các phép tính cho bạn.
histdeln(){
# Get the current history number
n=$(history 1 | awk '{print $1}')
# Call histdel with the appropriate range
histdel $(( $n - $1 )) $(( $n - 1 ))
}
Hàm này mất 1 đối số, số mục lịch sử trước đó cần xóa. Vì vậy, để xóa 10 lệnh cuối cùng khỏi lịch sử chỉ cần sử dụng histdeln 10
.
vi $HISTFILE
và xóa những gì bạn muốn. Sử dụnghead -n -10
nếu bạn phải tự động hóa nó.