重复已关闭,但这还不够(我觉得我必须频繁输入命令)。
假设我有 2000 条历史记录bash
,并且有一个命令我过去经常使用(n
次),但最近没有使用,现在我想再次使用。假设此命令位于历史记录中最旧的位置,并将在下一次非重复命令执行后被逐出。我希望保留此命令,并将最旧的命令(使用次数 < n
)从历史记录中逐出。
有人可能会说,这会使bash
历史记录不再是(线性)历史记录。我同意,但我不在乎,因为我想轻松访问我最喜欢的命令(自动收集)。
bash
我在 Ubuntu 15.10 上使用4.3.42。
答案1
警告:这并不是对问题本身的回答,而是一种您可能会觉得有用的方法的建议。
我理解你的痛苦。我也喜欢保留我的 Bash 历史记录,并能够回忆起很久以前可能运行过的命令。我已经开发出一种方法,可以让我将所有 Bash 历史记录保持在合理的历史记录大小内。
我的 Bash 历史记录设置是:
HISTCONTROL=ignoreboth:erasedups HISTIGNORE="?:??:???:$HISTIGNORE"
这有助于减少 Bash 历史记录中出现的条目。 像 这样的命令
ls
输入起来比调用起来更短,因此没有必要存储它们(这就是 的用途HISTIGNORE
)。ignoreboth
是ignorespace
和 的简写ignoredups
。 前者可防止以空格开头的条目出现在历史记录中。 我将它用于那些我知道永远不会调用或永远不想调用的命令,例如rm -rf *
:)。 默认情况下,我忽略了更多内容(未显示),这可以减少历史记录的大小。尽管采取了上述对策,但重复项仍会出现在我的历史记录中(例如,由于同时打开了多个 Bash shell)。我的提示中有一个计数器,可显示当前历史记录大小
PS1='\u@\h:\w:\!> '
(相关代码为
\!
,又名该命令的历史编号)这告诉我何时需要“清理”(参见下一步)。我通过运行以下命令定期“清理”我的 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 的命令;我发现这对于保持命令流分离非常有帮助。
另一个优点是,我可以随时清除旧的窗口历史记录,因为摘要将包含将来的“有用”命令。您还可以将历史记录摘要复制到另一台机器,以从在不同机器上完成的工作中受益。
它很简单,但这也是我在不到一个小时内拼凑起来的。也许这会有所帮助?
最糟糕的情况是,它可能是更好事物的基础?