我想做点什么
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'
之类的事情得到一个不错的结果,然后想要从这一点看到一些历史加上几条线,或者可能包含那一点的历史。
答案 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)
我们希望显示从start
到end
的条目。
bash中内置的$HISTCMD
变量提供了the number of the latest entry to the history buffer
history
命令采用n
参数,该参数告诉它显示最后n
个条目。因此,显示带有n
参数的条目时的起始编号为:
start = $HISTCMD - n
根据n
重新排列,我们得到了这个表达式,可以传递给history
:
n = $HISTCMD - start
现在,我们只想显示从start
到end
的条目,即end - start + 1
条目。我们可以使用head
来提供这些内容。
将其包含在一个易于使用的bash函数中:
$ 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)
以下是使用grep:
的方法$ 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