两个时间点之间的Bash历史

时间:2013-12-12 21:46:20

标签: bash shell history built-in

我想做点什么

history 2960-2966

期待这种输出:

2960  2013-12-09 20:59:35 bundle update
2961  2013-12-09 21:00:08 git st
2962  2013-12-09 21:00:12 git add .
2963  2013-12-09 21:01:19 git st
2964  2013-12-09 21:01:43 git log
2965  2013-12-09 21:02:45 git st
2966  2013-12-09 21:02:57 git reset HEAD Gemfile.lock

这可以在bash shell中使用吗?

更新:我的问题是看到这七个历史行,而不是日期本身;只是在我的.bash_profile中有一个HISTTIMEFORMAT指令才能给出日期和时间戳。如果我要删除它,那么我希望history 2960-2966某些来生成此输出:

2960  bundle update
2961  git st
2962  git add .
2963  git st
2964  git log
2965  git st
2966  git reset HEAD Gemfile.lock

我希望显示所需的历史记录行,最好使用我在.bash_profile中指定的任何自定义。

为什么我要这个?一个非常简单的用例是:我做history | grep 'bundle update'之类的事情得到一个不错的结果,然后想要从这一点看到一些历史加上几条线,或者可能包含那一点的历史。

7 个答案:

答案 0 :(得分:3)

您可以使用sed。说:

history | sed -n '2960,2966p'

history命令的输出中打印行号2960到2966。

引用help history

If the $HISTTIMEFORMAT variable is set and not null, its value is used
as a format string for strftime(3) to print the time stamp associated
with each displayed history entry.  No time stamps are printed otherwise.

您可以设置格式以获得所需格式的时间戳,方法是:

export HISTTIMEFORMAT="%F %T "

由于history文件默认只在会话结束时写入,因此您需要说:

history -w

以便更新当前会话中的历史文件。

答案 1 :(得分:1)

尝试以下命令。这将显示2960到2966的范围

fc -ln 2960-2966

执行它们你可以尝试这个

eval "$(fc -ln 2960 2966)"

希望这有帮助。

Tharanga Abeyseela

答案 2 :(得分:1)

我们希望显示从startend的条目。

中内置的$HISTCMD变量提供了the number of the latest entry to the history buffer history命令采用n参数,该参数告诉它显示最后n个条目。因此,显示带有n参数的条目时的起始编号为:

start = $HISTCMD - n

根据n重新排列,我们得到了这个表达式,可以传递给history

n = $HISTCMD - start

现在,我们只想显示从startend的条目,即end - start + 1条目。我们可以使用head来提供这些内容。

将其包含在一个易于使用的函数中:

$ function histrange {
>     history $(($HISTCMD - $1)) | head -n$(($2 - $1 + 1))
> }
$ histrange 2097 2100
 2097  2013-12-15 21:54:02 man ls
 2098  2013-12-15 21:54:06 ls
 2099  2013-12-15 21:54:10 man df
 2100  2013-12-15 21:54:15 df -k .
$ 

答案 3 :(得分:1)

以下是使用

的方法
$ function histrange {
> history | grep -E -A $(($2 - $1)) "^[[:space:]]*$1[[:space:]]"
> }
$ histrange 2100 2105
 2100  2013-12-15 21:54:15 df -k .
 2101  2013-12-15 21:54:18 history
 2102  2013-12-15 21:54:40 histrange 2097 2100
 2103  2013-12-15 21:55:30 man grep
 2104  2013-12-15 22:35:33 man history
 2105  2013-12-15 22:38:35 export HISTTIMEFORMAT="%F %T "
$

我们确保正则表达式锚定到行的开头,在起始编号之前有一个零或更多的空格,在起始编号之后有一个空格,所以我们只将起始编号与历史条目编号完全匹配,没有任何内容其他。我们使用-A选项grep来显示匹配后的$end - $start行。

答案 4 :(得分:1)

fc -l 2960 2966

这适用于OS 10.6.X.它完全满足您的需求。希望这有帮助!

答案 5 :(得分:1)

根据你为什么要这样说,

history | grep -A 4 -B 3 whatyousearchfor

应该给你你想要的东西。

whatyousearchfor可以是您原来的serch术语,也可以是第一个没有上下文行的grep,然后使用历史记录行号whatyousearchfor

答案 6 :(得分:0)

$> export HISTTIMEFORMAT="    %F    %T     "

然后:

$> history | awk '{if (1070<=$1 && $1<=1075) {print}}'

这几乎是devnull的回应。 从来没有这样的事情,但我喜欢这个想法,并认为它对我也有用。我从内置的bash帮助中获得了一个近似的答案。

$> help history
  

...

     

如果设置$ HISTTIMEFORMAT变量且不为null,则使用其值     作为strftime(3)的格式字符串来打印关联的时间戳     每个显示的历史记录条目。否则不会打印时间戳。

然后

$> man 3 srtftime