从 bash 历史记录中删除最后 N 行

从 bash 历史记录中删除最后 N 行

当不小心将文件粘贴到 shell 中时,它会在 bash 历史记录中放入大量丑陋的无意义条目。有没有一种干净的方法来删除这些条目?显然我可以关闭 shell 并.bash_history手动编辑文件,但也许有某种 API 可用于修改当前 shell 的历史记录?

答案1

命令提示符中的这一行就会有所帮助。

for i in {1..N}; do history -d START_NUM; done

其中 START_NUM 是历史记录中条目的起始位置。 N 是您可能要删除的条目数。

前任:for i in {1..50}; do history -d 1030; done

答案2

从 开始bash-5.0-alpha,该history命令现在采用删除 ( ) 选项的范围-d。看拉斯塔文件的回答

对于旧版本,解决方法如下。


您可以使用history -d offset内置命令可从当前 shell 历史记录中删除特定行,或history -c清除整个历史记录。

如果您想删除一系列行,那么它并不实际,因为它只需要一个偏移量作为参数,但您可以将其包装在带有循环的函数中。

rmhist() {
    start=$1
    end=$2
    count=$(( end - start ))
    while [ $count -ge 0 ] ; do
        history -d $start
        ((count--))
    done
}

用 来调用它rmhist first_line_to_delete last_line_to_delete。 (根据输出的行号history。)

(用于history -w强制写入历史文件。)

答案3

根据的手册页重击 5.x, history内置命令现在也采用范围:

-d offset

    删除该位置的历史记录offset。如果offset为负数,它被解释为相对于比最后一个历史位置大1的索引,因此负索引从历史记录的末尾开始倒数,索引-1指的是当前history -d命令。

-d start-end

    删除仓位之间的历史记录startend, 包括的。正值和负值startend的解释如上所述。

history --help目前(截至 v5.2.21)并未反映这一点:

 Options:
   -c        clear the history list by deleting all of the entries
   -d offset delete the history entry at position OFFSET. Negative
             offsets count back from the end of the history list
 
   -a        append history lines from this session to the history file
   ...

例如,history -d 2031-2034一次删除四行。您可以使用$HISTCMD从最新行开始删除线向后。


您还可以使用 导出history -w tmpfile,然后编辑该文件,使用 清除history -c,然后使用 读回history -r tmpfile。无需写信.bash_history(直接)。

答案4

arghistory -d接受一个范围,并且$HISTCMD是历史记录中的最大数字。

此函数用于n从历史记录中删除最后的条目(只需传入要删除的历史命令的数量,例如rmhist 5

$ rmhist()  { history -d $(($HISTCMD - $1))-$HISTCMD ;}

或者..使用这样的参数来从历史记录(包括)或最后的“n”个命令中删除:

rmhist() { 
  case $1 in 
    --from|from) local start=$2; ;; 
    --last|last) local start=$(($HISTCMD - $2)) ;; 
    *) echo "Try rmhist --from # or rmhist --last n "; return ;; 
  esac; 
  history -d ${start}-${HISTCMD}
}

结果看起来像这样:

 5778  ls /etc
 5779  ls /tmp
 5780  ls /dev
 5781  ll
 5782  cd /tmp
 5783  cd
 5784  history
(base) ~ $ rmhist --last 3
(base) ~ $ history 5
 5778  ls /etc
 5779  ls /tmp
 5780  ls /dev
 5781  ll
 5782  history 5
(base) ~ $ rmhist --from 5780
(base) ~ $ history 5
 5776  history 10
 5777  ls
 5778  ls /etc
 5779  ls /tmp
 5780  history 5

相关内容