执行历史记录中与正则表达式或 grep 匹配的命令

执行历史记录中与正则表达式或 grep 匹配的命令

我想知道是否可以执行历史记录中与某个正则表达式匹配的命令?我知道你可以做类似的事情

fc 232 248

它将进入你的history,然后连续进行修订232-248。

但是,如果中间的某些命令是我不想做的事情,有没有办法可以指定它?现在我查找我的history并将其输出到grep

history | grep checkout

因此,这将查找我通过结账完成的所有终端操作。

232 git checkout master files/file1.txt
234 git checkout master files/file2.txt
248 git checkout master files/file3.txt

它过滤掉了一些数字,所以我只想执行那些已经通过管道输出的数字。而不是介于两者之间的一切

答案1

要从 bash执行包含特定字符串(例如"checkout")或正则表达式(例如)的所有命令:"checkout.+file\d"history

grep -E "string_exp" $HOME/.bash_history | while read line; do eval "$line"; done

您可以将其另存为函数~/.bashrc

#!/bin/bash

all_prev () {
   grep -E "$1" $HOME/.bash_history | while read line; do eval "$line"; done
}

然后以后您只需输入:

all_prev checkout

编辑:

  • 为了避免在.bash_history文件随着时间的推移积累这些命令时运行许多重复的命令,请确保export HISTCONTROL=ignoredups已设置~/.bashrc(如果尚未设置)。

  • 为了避免all_prev每次都重新运行包含搜索词的搜索,请使用正则表达式^$在行的开头和结尾指定字符。


但是,也许您还应该检查具有更强大历史过滤功能的 shell,例如zsh(甚至fish)。

相关内容