如何让 bash 永远保留最常用的历史记录条目?

如何让 bash 永远保留最常用的历史记录条目?

重复已关闭,但这还不够(我觉得我必须频繁输入命令)。

假设我有 2000 条历史记录bash,并且有一个命令我过去经常使用(n次),但最近没有使用,现在我想再次使用。假设此命令位于历史记录中最旧的位置,并将在下一次非重复命令执行后被逐出。我希望保留此命令,并将最旧的命令(使用次数 < n)从历史记录中逐出。

有人可能会说,这会使bash历史记录不再是(线性)历史记录。我同意,但我不在乎,因为我想轻松访问我最喜欢的命令(自动收集)。

bash我在 Ubuntu 15.10 上使用4.3.42。

答案1

警告:这并不是对问题本身的回答,而是一种您可能会觉得有用的方法的建议。

我理解你的痛苦。我也喜欢保留我的 Bash 历史记录,并能够回忆起很久以前可能运行过的命令。我已经开发出一种方法,可以让我将所有 Bash 历史记录保持在合理的历史记录大小内。

  1. 我的 Bash 历史记录设置是:

    HISTCONTROL=ignoreboth:erasedups
    HISTIGNORE="?:??:???:$HISTIGNORE"
    

    这有助于减少 Bash 历史记录中出现的条目。 像 这样的命令ls输入起来比调用起来更短,因此没有必要存储它们(这就是 的用途HISTIGNORE)。ignorebothignorespace和 的简写ignoredups。 前者可防止以空格开头的条目出现在历史记录中。 我将它用于那些我知道永远不会调用或永远不想调用的命令,例如rm -rf *:)。 默认情况下,我忽略了更多内容(未显示),这可以减少历史记录的大小。

  2. 尽管采取了上述对策,但重复项仍会出现在我的历史记录中(例如,由于同时打开了多个 Bash shell)。我的提示中有一个计数器,可显示当前历史记录大小

    PS1='\u@\h:\w:\!> '
    

    (相关代码为\!,又名该命令的历史编号)这告诉我何时需要“清理”(参见下一步)。

  3. 我通过运行以下命令定期“清理”我的 Bash 历史记录:

    tac ~/.bash_history | awk '!seen[$0]++' | tac > ~/.bash_history.new && mv ~/.bash_history.new ~/.bash_history
    

(当然,假设您的 Bash 历史记录已存储~/.bash_history)。此命令会删除重复项,同时遵循顺序:最后使用的命令保留在最后。仅保留最后(最新)的重复项。

通过这种方法,我能够将所有 Bash 历史记录保存在 600 到 1000 个条目的非常适中的历史记录大小内。

答案2

另一个答案并没有回答这个确切的问题,但可能为根本问题提供可行的解决方案:

我有几个从我的 .bashrc/.bash_profile 触发的设置/脚本,我用它们来捕获我在任何终端输入的任何命令,然后将其汇总为一个唯一的列表(删除一些我认为是“垃圾”的内容),然后可以轻松搜索。

#!/bin/bash
DATE=`date +%Y-%m-%d_%H%M%S.%3N`
export HISTFILE=~/.bash_sessions/${DATE}.history
export HISTSIZE="INFINITE"
echo -e "\033[1;34mBash history saved to $HISTFILE (history -w to save latest)\033[0m"
alias dir="history -w;ls -lAF"

它在每个终端启动(和 SSH 会话)时运行。

再加上这个:

alias hist='cat ~/allHistory.txt | grep '

将给出搜索历史摘要的命令(并将搜索词也着色)。示例:

$ hist docker
revert devops/local/docker-compose.yml
set | grep dockerdown
sudo tcpdump -N -A 'tcp port 80' -i docker0

除此之外,我还有一个每小时运行一次的 cron 作业,将命令历史记录汇总到单个可搜索的历史文件中:

#!/bin/bash
cat $HOME/.bash_sessions/*.history $HOME/allHistory.txt | egrep -v "^(man |dir |cd |ps |cat |cp |hist |history |alias |which |top |tree |rm |rmdir )" | egrep -v -e '^(echo [^|]+)$' | grep -v " -help" | sort -u > $HOME/allHistory.new
mv $HOME/allHistory.new $HOME/allHistory.txt

另外一个好处是所有打开的终端的历史记录不会混合,因此当您尝试从历史记录中前 3 个的窗口 1 重新运行命令时,您将看不到来自窗口 2、窗口 3 或窗口 4 的命令;我发现这对于保持命令流分离非常有帮助。

另一个优点是,我可以随时清除旧的窗口历史记录,因为摘要将包含将来的“有用”命令。您还可以将历史记录摘要复制到另一台机器,以从在不同机器上完成的工作中受益。

它很简单,但这也是我在不到一个小时内拼凑起来的。也许这会有所帮助?

最糟糕的情况是,它可能是更好事物的基础?

相关内容