搜索历史记录并获取指定窗口大小的时间上下文

搜索历史记录并获取指定窗口大小的时间上下文

我经常发现自己通过做类似的事情来搜索我的历史

history | grep searchterm

searchterm这将返回我在命令中使用的所有时间的列表。然而,我常常想知道n以前的命令和我在该命令之前和之后输入的下一个命令包含searchterm.通常,我运行命令的上下文非常有用。

我想做的是

> history-search-context searchterm n m

并获取输入的命令的单独列表n和 之前的命令包含 . 的任何历史记录条目之后的命令searchterm

例子:

> history-search-context mycommand 2 1

687 cd some/directory
688 ls -a
689 mycommand -flag arg1
690 touch file
-------------
943 apt-get install something
944 pwd
945 mycommand -otherflag arg1 arg2 arg3
946 rm file

这会告诉我,我mycommand在记录的历史记录中使用了两次一些有趣的标志和参数,并且在 [-2,+1] 命令的窗口内,我有一次运行它some/directory并必须创建一个文件,另一次,我安装了something,检查了我所在的目录,然后删除了file

有现有的方法可以做到这一点吗?如果没有,如何实现这一点?

答案1

我会使用辅助函数 和 来处理它grep,因为(GNU)grep 有一组自然的“匹配之前和之后的行”选项。简单的版本是:

histgrep() {
  history | grep -B $2 -A $3 "$1"
}

...你可以像上面的历史搜索上下文命令一样使用它:

$ histgrep jeff 1 1

  517  vi go.sh
  518  x=jeff
  519  y=/tmp
--
  832  sudo visudo
  833  sudo adduser jeff2
  834  man sudoers
--
  841  sudo ls -al /var/lib/sudo/lectured
  842  sudo rm /var/lib/sudo/lectured/jeff /var/lib/sudo/lectured/schaller
  843  sudo ls
--
  940  ls *[[:digit:]][[:digit:]][[:digit:]][[:digit:]][[:digit:]]*
  941  touch jeff߄߅߆߇߈߉.txt
  942  ls
--
 1235  histgrep a b c
 1236  histgrep jeff a 1
 1237  histgrep jeff 1 a
 1238  histgrep jeff 1 1

添加一些基本的错误检查后,该函数将是:

histgrep() {
  if [ "$#" -ne 3 ]
  then
    echo "Usage: histgrep searchterm n-before m-after"
    return
  fi
  case "$2$3" in
  (*[^0-9]*)
        echo "Usage: histgrep searchterm n-before m-after"
        return
        ;;
  esac
  history | grep -B $2 -A $3 "$1"
}

如果你愿意的话,你可以很容易地命名它,history-search-context而不是:histgrep

history-search-context() {
# ...
}

相关内容