簡體   English   中英

如何刪除shell中最后10個命令的歷史記錄?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM