Bash - 增量历史搜索(ctrl+r) - 匹配多个不相邻的单词

Bash - 增量历史搜索(ctrl+r) - 匹配多个不相邻的单词

当使用Ctrl+R搜索 bash 历史记录时,是否有某种方法可以匹配两个不相邻的单词。例如,假设我想找到包含httpdawk但不相邻的最后一个命令。有没有比通过 grep bash 历史记录来匹配两者或按Ctrl+R循环遍历匹配一个关键字的条目直到找到所需命令更好的选择?

答案1

Bash 参考手册:

Readline 提供用于在命令历史记录中搜索包含指定字符串的行的命令

您需要一个正则表达式而不是固定字符串。

尝试哈斯特:
1.安装
2.配置

您应该看到类似这样的内容hstr
在此输入图像描述

更新:
另一个工具是弗兹夫

  1. 安装: git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf && ~/.fzf/install

  2. 重新分配您的资源~/.bashrcsource ~/.bashrc

您应该看到类似这样的内容fzf在此输入图像描述

答案2

我不知道有什么内置方法可以做到这一点,但是您可以编写一个小函数来执行 grep 并编辑历史文件,以便结果出现在最后,然后您可以轻松地选择一个匹配项,只需在新的历史中不断前进。 (这确实会改变您历史记录中的命令顺序)。

这是这样一个函数。我假设您想要找到 2 个(或更多)单词,无论它们出现的顺序如何。您可以设置要接受的最大匹配数;这里是 10。我还假设初始 grep 不会返回巨大的字符串,或者您需要使用临时文件而不是 bash 字符串。

hist(){
    local maxmatches=10 word=$1 matches new nummatches
    shift
    history -w # write out history to HISTFILE
    matches=$(grep -e "$word" $HISTFILE)
    for word
    do   new=$(echo "$matches" | grep -e "$word")  || return # if str too big
         matches=$new
    done
    nummatches=$(echo "$matches" | wc -l)
    echo "$nummatches matches"
    if [ $nummatches -gt 0 -a $nummatches -le $maxmatches ]
    then echo "$matches" >>$HISTFILE # add matches to end of file
         history -c # clear history
         history -r # read history from file
         history $nummatches # show last few lines
    else echo "zero or too many matches. (max $maxmatches)"
    fi
}

如果您不想对单词进行正则表达式模式匹配,请使用 fgrep 而不是 grep。如果您只需要给定的顺序,请使用单个单词,例如“httpd.*awk”。如果以这种方式只使用一个单词,您也可以删除 for 循环。

相关内容