[英]Print the history for the last 10 Commands on the session on each log in to the shell
[英]How to delete history of last 10 commands in shell?
命令如下
511 clear
512 history
513 history -d 505
514 history
515 history -d 507 510 513
516 history
517 history -d 509
518 history
519 history -d 511
520 history
我可以通過history -d 511
刪除單個命令,但是如何在 shell 中使用單個命令刪除最后 10 個命令和 10 個命令之間的歷史記錄?
我們可以編寫一個bash腳本並執行刪除歷史記錄嗎?
您是否嘗試過直接編輯歷史文件:
~/.bash_history
我的答案是基於以前的答案,但增加了反轉順序,以便歷史項目從最近刪除到最近刪除。
獲取您當前的歷史記錄(調整您想要查看的行數):
history | tail -n 10
這給了我類似的東西
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"
選擇要刪除的項目的開始和結束位置。 我要刪除條目 1006 到 1008。
for h in $(seq 1006 1008); do history -d 1006; done
這將為 1006 生成history -d
命令,然后 1007 變成 1006 並且 1006 被刪除,然后 1008(變成 1007)現在是 1006 並被刪除。
如果我還想刪除 history delete 命令,那就有點復雜了,因為您需要知道當前的最大歷史條目。
你可以用(可能有更好的方法):
history 1 | awk '{print $1}'
把它放在一起,你可以用它來刪除一個范圍,也可以刪除歷史刪除命令:
for h in $(seq 1006 1008); do history -d 1006; done; history -d $(history 1 | awk '{print $1}')
將所有這些都包裝在一個函數中以添加到您的~/.bashrc
:
histdel(){
for h in $(seq $1 $2); do
history -d $1
done
history -d $(history 1 | awk '{print $1}')
}
刪除命令 4、5 和 6 (1049-1051) 並隱藏證據的示例:
[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
問題實際上是從歷史記錄中刪除最后 10 個命令,因此如果您想節省一點精力,您可以使用另一個函數來調用histdel
函數來為您進行計算。
histdeln(){
# Get the current history number
n=$(history 1 | awk '{print $1}')
# Call histdel with the appropriate range
histdel $(( $n - $1 )) $(( $n - 1 ))
}
此函數接受 1 個參數,即要刪除的先前歷史記錄項的數量。 因此,要從歷史記錄中刪除最后 10 個命令,只需使用histdeln 10
。
使用 Bash 5,你現在可以做一個范圍......萬歲!:
history -d 511-520
或倒數 10:
history -d -10--1
摘自Bash 5 手冊頁:
'歷史'
選項(如果提供)具有以下含義:
'-d OFFSET' 刪除位置 OFFSET 的歷史條目。 如果 OFFSET 為正數,則應按照顯示歷史記錄時出現的方式進行指定。 如果 OFFSET 為負數,則將其解釋為相對於比最后一個歷史位置大 1 的位置,因此負索引從歷史記錄的末尾開始倒計時,並且“-1”的索引指的是當前的“history -d”命令。
'-d START-END' 刪除位置 START 和 END 之間的歷史條目,包括。 START 和 END 的正值和負值按上述解釋。
這是我對 Bash 4 的解決方案。它以最低索引開始迭代刪除單個條目或一系列歷史記錄。
delHistory () {
count=$(( ${2:-$1} - $1 ))
while [[ $count -ge 0 ]]; do
history -d "$1"
((count--))
done
}
delHistory 511 520
for x in `seq $1 $2`
do
history -d $1
done
首先,鍵入: history
並記下要刪除的行號序列。
要清除從 1800 行到 1815 行的行,請在終端中寫入以下內容:
$ for line in $(seq 1800 1815) ; do history -d 1800; done
如果要刪除刪除命令的歷史記錄,則為 1815 = 1816 添加 +1,該序列的歷史記錄 + 刪除命令將被刪除。
例如 :
$ for line in $(seq 1800 1816) ; do history -d 1800; done
結合上面的答案:
history -w vi ~/.bash_history history -r
改變了支撐迭代器,很好的調用。 此外,使用反向迭代器調用此函數。
你可能可以做這樣的事情:
#!/bin/bash
HISTFILE=~/.bash_history # if you are running it in a
# non interactive shell history would not work else
set -o history
for i in `seq $1 $2`;
do
history -d $i
done
history -w
你會像這樣喚起:
./nameOfYourScript 563 514
請注意,我沒有對邊界進行任何錯誤檢查。 我將把它留給讀者作為練習。
另見這個問題
也許會對某人有用。
當您登錄當前會話的任何控制台/終端歷史記錄的任何用戶時,僅存在於某些“緩沖區”中,該緩沖區在您注銷時刷新到 ~/.bash_history 。
所以,為了保密,你可以:
history -r && exit
並且您將被注銷並清除所有會話的(也是唯一的)歷史記錄;)
我使用了此線程中共享的解決方案組合來擦除命令歷史記錄中的跟蹤。 首先,我驗證了保存的命令歷史記錄的位置:
echo $HISTFILE
我編輯了歷史:
vi <pathToFile>
之后,我使用以下命令刷新當前會話歷史緩沖區:
history -r && exit
下次您進入此會話時,您將在命令歷史記錄中看到的最后一個命令是您在pathToFile 上留下的最后一個命令。
不是直接要求的答案,但可能是問題的根本原因:
您還可以通過在命令前加上空格字符來防止命令進入歷史記錄:
# This command will be in the history
echo Hello world
# This will not
echo Hello world
刪除最后 10 個條目(根據您的示例):
history -d 511 520
history -c 將清除所有歷史記錄。
我使用此腳本刪除歷史記錄中的最后 10 個命令:
pos=$HISTCMD; start=$(( $pos-11 )); end=$(( $pos-1 )); for i in $(eval echo "{${start}..${end}}"); do history -d $start; done
它使用$HISTCMD
環境$HISTCMD
來獲取歷史索引並使用它來刪除history
最后 10 個條目。
我用這個(我有 bash 4):
histrm() {
local num=${1:- 1}
builtin history -d $(builtin history | sed -rn '$s/^[^[:digit:]]+([[:digit:]]+)[^[:digit:]].*$/\1/p')
(( num-- )) && $FUNCNAME $num
builtin history -w
}
builtin history
部分以及最后一個-w
是因為我有一些著名技巧的變體來跨終端共享歷史,如果沒有這些部分,這個功能就會崩潰。 它們確保調用內置的真實 bash history
(而不是我自己的包裝器),並在刪除條目后立即將歷史記錄寫入 HISTFILE。
然而,這將像“正常”歷史配置一樣工作。
您應該使用要刪除的最后一個條目的數量調用它,例如:
histrm 10
將刪除最后 10 個條目。
簡短而甜蜜: for i in {1..10}; do history -d $(($HISTCMD-11)); done
for i in {1..10}; do history -d $(($HISTCMD-11)); done
history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;
粗暴但實用
for h in $(seq $(history | tail -1 | awk '{print $1-N}') $(history | tail -1 | awk '{print $1}') | tac); do history -d $h; done; history -d $(history | tail -1 | awk '{print $1}')
如果要刪除 10 行,只需將 N 的值更改為 10。
一個簡單的函數可以按數字殺死所有人(盡管它會導致錯誤)
kill_hist() {
for i in $(echo $@ | sed -e 's/ /\n/g;' | sort -rn | sed -e 's/\n/ /;')
do
history -d $i;
done
}
kill_hist `seq 511 520`
# or kill a few ranges
kill_hist `seq 1001 1010` `seq 1200 1201`
請嘗試以下操作:
for i in {511..520}; do history -d $i; echo "history -d $i"; done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.