搜索Shell历史的最佳方法


78

有没有比grep更好的方法来搜索历史文件以查找命令?我确实知道命令的开头是什么,但我不知道它的历史有多远。

更新:以前是zsh特有的,但是由于答案重叠,请在此处随意回答任何shell(或模式(vi / emacs))。

Answers:


73

CtrlR正如描述符描述的,+ 通常是最好的方法。您也可以使用!string,以运行以开头的最新命令string,或者!?string?使用包含的最新命令string

(我认为这是与此问题相关的唯一内容,但是我在此答案中涵盖了更多的历史记录命令)


4
如何使“ ctrl + r”看起来像这样?
xenoterracide

13
@xen <kbd>Ctrl+R</kbd>答案来源
Michael Mrozek

我没有意识到SE引擎接受了任何HTML谢谢。
xenoterracide

我不知道kbd关键字会正确解释“ ctrl”和“ +”!我曾经分别标记每个键。谢谢!
Olivier Dulac 2015年

2
@OlivierDulac不幸的是,那不是我过去格式化键的方式;后来有人编辑了我的答案以使它们成为单独的键
Michael Mrozek

30

使用Bash时,键入Control- R,然后开始键入。键入Control- R输入一些文本后反复输入将使您回到匹配的命令行中。


18

不知道这是否有帮助,但是我喜欢使用ctrl- r然后开始键入命令。它应该遍历您的历史并为您呈现第一场比赛。要在比赛中切换,只需再次点击ctrl- r


2
抱歉,忘记了zsh。您可能必须将此键绑定添加到您的〜/ .zshrc中:bindkey'^ R'history-incremental-search-backward
decriptor 2010年

17

如果将以下内容添加到 ~/.inputrc

"\e[5~": history-search-backward
"\e[6~": history-search-forward

并重新启动Bash,您可以开始键入,然后使用Page UpPage Down来向前和向后浏览以您刚键入的相同前缀开头的行的历史记录。

(有些人可能更喜欢使用\e[A\e[B,它将代替常规UpDown操作,而不是绑定新键。)


我更喜欢将这些命令映射到Alt + UpAlt + Down。根据键盘仿真,终端仿真使用这些组合可能会映射到\E[A\E[A(例如,带有Linux键绑定的KDE Konsole)或\E[1;3A和和\E[1;3B(例如,带有X Free 4绑定的XFCE Terminal或KDE Konsole)。
Christian Herenz

9

已经提到的Ctrl- 调用的交互式提示R是最方便的方法。另外,重新映射UpDown箭头键以在历史记录中搜索命令行上当前存在的前缀非常流行,但是这需要~/.inputrc文件进行一些更改

经典且较少交互的解决方案是使用shell历史记录扩展。打字

!foo

将执行以foo和开头的最后一个命令

!?foo

将执行包含的最后一个命令foo。假设您的shell是Bash或兼容的,则可以在Bash参考手册中找到有关历史记录扩展的更多信息。


6

如果添加stty -ixon~/.bashrc文件中,则Ctrl- s将与Ctrl- 相反r


我想C-s用于此目的,但是我的终端被冻结了;谨防!(嗯,我还没有雇用任何人stty ixon,不确定这是干什么的。)
imz-Ivan Zakharyaschev 2011年

3
@imz:C-q将“解冻”。它C-s是常用的软件流控制字符,曾经在使用慢速串行连接时手动中断(暂停)输出流很有用。现在,在大多数情况下,输出是如此之快,以至于您按时想要看到的内容C-s已经滚动了。stty -ixon关闭软件流控制。
丹尼斯·威廉姆森

太棒了!我已经搜寻了多年,以寻求一种在历史上向前滚动的方式。
marlar

3

如果键入,!ls则bash将浏览您的历史记录并执行以“ ls”开头的最新命令


2

可能是zsh特有的。在研究这个答案时,发现 vi-history-search-backward可以/在vi模式下进行搜索(我没有提到我当时所处的状态),然后可以使用nN分别向前和向后搜索(按enter)。


2

我很惊讶没有提到它-但是您可以通过执行以下操作在bash或ksh中选择vi模式:

set -o vi

...或将其用作~/.inputrc(对于bash等程序中使用的GNU readline 的内容):

set editing-mode vi

然后,在此之后,您可以使用Esc进入命令模式并使用k来回顾历史并j前进。您也可以使用/搜索进行正常搜索,然后?反向搜索。

如果使用~/.inputrc,则这不仅适用于GNU bash,而且适用于使用GNU readline的任何程序(例如CLISP)以及可能的程序(如MySQL命令外壳和CPAN外壳)。


2

在使用反向搜索(使用Ctrl-R命令)时要向前切换:

  1. 打开您的.bashrc文件:
    sudo gedit ~/.bashrc

  2. 添加此行(字母“ f”可以替换为系统尚未使用的另一个字母)

    bind '"\C-f": forward-search-history' 
  3. 闭上你的文件,并更新你的.bashrc(或打开另一个终端)使用命令:
    source ~/.bashrc. ~/.bashrc

现在,您可以通过快捷键在历史记录中前进:Ctrl + f

在Ubuntu 18.04 LTS上工作


1

我大部分时间都使用以下两种方式。
但是请注意,他们两个都搜索起始字符。

  1. tcsh:键入命令的一些字符,然后Esc+ p它将显示从该键序列开始的前一个命令,再次按它将显示另一个命令。
  2. ksh:使用fc -e - <SPACE> <first few char for your previous >此命令将运行与该序列匹配的最后一个命令。

我无法在Bash中为我的ksh和tcsh 找到类似Ctrl+的东西R


3
Ctrl + r在ksh中的作用与Bash有所不同。按Ctrl + r,然后输入要查找的字符串,然后按Enter。要搜索相同的内容,请按Ctrl + r并输入,而不必重新输入字符串。set -o emacs顺便说一下,这是在模式下。
丹尼斯·威廉姆森

@Dennis:+1 :-)
与Hemant

1

有一种使用方法Ctrl- Rtcsh一起使用。在您的中添加以下内容~/.cshrc

bindkey "^r" i-search-back (这只是插入符号和字母r)

这对我来说是最大的省时方法。


1

与@ephemient的答案类似,但您可以将.bashrc放入

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-foward'

并输入词组的一部分,然后使用向上/向下箭头浏览匹配的最新选项。这是matlab的默认行为。

对于大多数人来说,如果您想将设置移植到新系统上,则记住记住您就很容易记住自己~/.bashrc~/.inputrc


0

是的,它存在,至少在使用zsh的情况下。只需开始键入命令,然后按M-pESC p),它将找到与您键入的命令匹配的先前命令。再按一次即可找到下一个匹配项。


这个答案可以做更多的解释。
phunehehe 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.