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