问题:了解以下时间戳
1241036430
在 ~/.history
: 1241036336:0;vim ~/.zshrc
: 1241036379:0;vim ~/bin/HideTopBar
: 1241036421:0;ls
: 1241036430:0;cat ~/.history
当我有
setopt EXTENDED_HISTORY
HISTFILE=~/.history
在 .zshrc 中。
如何读取时间戳?
试试history -d
。或者只需键入history -
并按 control-D 即可获得所有各种选项:
% history -
-D -- print elapsed times
-E -- dd.mm.yyyy format time-stamps
-d -- print time-stamps
-f -- mm/dd/yyyy format time-stamps
-i -- yyyy-mm-dd format time-stamps
-m -- treat first argument as a pattern
-n -- suppress line numbers
-r -- reverse order of the commands
您可以使用从zsh 邮件列表上的答案中获取的单行代码,以人类可读的时间戳显示整个历史记录:
perl -lne 'm#: (\d+):\d+;(.+)# && printf "%s :: %s\n",scalar localtime $1,$2' $HISTFILE
我建议将输出通过管道传输到寻呼机(less
例如)以使其更具可读性。
这个简单的util被称为localtime
是读取带有时间戳的文件的黄金:
#!/usr/bin/perl
# http://perl.plover.com/classes/mybin/samples/source/localtime
if ($ARGV[0] eq '-f') {
*show_localtime = \&show_localtime_list;
shift;
}
if (@ARGV) {
for (@ARGV) {
print show_localtime($_), "\n";
}
} else {
while (<>) {
s/^(\d+)/show_localtime($1)/e;
print;
}
}
sub show_localtime {
my $t = shift;
scalar localtime $t;
}
sub show_localtime_list {
my $t = shift;
my @a = localtime $t;
"@a\n"
}
它处理了很多情况,并且似乎理解以秒和微秒为单位的时间戳等。
$ localtime < ~/.histfile
<snip>
: Sat Sep 17 05:55:17 2016:0;cat localtime
使用 awk 转换时间戳
如果您想读取文件本身,例如与grep
任何其他过滤器一起使用,您需要转换时间戳。
我制作了这个脚本,将它保存在我的 .bashrc 中/usr/local/bin
,它适用于bash和zshell:
脚本 uhistory.awk在 /usr/local/bin/uhistory.awk
#!/usr/bin/awk -f
{
if (match($0,/^#/)) # bash
{
nlin++
#adata="@"substr($0,2)
#printf("%s ", adata)
cmdata = "date -d \"@" substr($0,2) "\" +\"%F %H:%M:%S\""
cmdata | getline datado
close(cmdata)
printf("%d %s ", nlin, datado)
}
else
if (match($0,/^:/)) # zshell
{
nlin++
split($0, arr, ":|;")
cmdata = "date -d \"@" substr(arr[2],2) "\" +\"%F %H:%M:%S\""
cmdata | getline datado
close(cmdata)
printf("%d : %s ; %ss % ", nlin, datado, arr[3])
for (i in arr)
{
if (i < 4)
continue
printf("%s ", arr[i])
}
printf("\n")
}
else
{
print $0
}
}
用法:您可以通过过滤器管道历史记录。假设 的历史文件zsh
具有以下格式:
:timestamp:duration;commands
没有uhistory.awk过滤器将是:
% head ~/.config/zsh/zhistfile
: 1570482839:0;la
: 1570482839:0;cd zsh
: 1570482839:0;ls
: 1570482839:1;cat verybigaliasfile.txt
: 1570482839:0;alias
: 1570482839:0;ls -la
: 1570482839:0;vi .zshrc
: 1570482839:0;alias
使用uhistory.awk过滤器,它将显示为:
% head ~/.config/zsh/zhistfile | uhistory.awk | grep alias
4 : 2019-10-07 18:13:59 ; 1s % cat verybigaliasfile.txt
5 : 2019-10-07 18:13:59 ; 0s % alias
9 : 2019-10-07 18:13:59 ; 0s % alias
但是,如果您的使用不涉及处理文件本身,那么您真正需要的只是一个别名。
将此行添加到您的.zsh_aliases
或您为别名设置的其他地方。
alias history='fc -il 1'
fc
或命令中的其他选项。检查与man zshbuiltins
更好的是使用相同的命令,因此如果您想在最后添加另一个键/选项,它不会造成混淆。在这种情况下,我建议:
alias history='history -i'
当然,您也可以通过管道传输结果,例如:
% history | grep alias
4 2019-10-07 18:13:59 cat verybigaliasfile.txt
5 2019-10-07 18:13:59 alias
9 2019-10-07 18:13:59 alias
在这种情况下,不会出现持续时间,但其余部分相同。
附录:您也可以使用history
命令本身来翻译保存的历史文件中的时间戳:
Nicholas Riley 解释的命令选项history
同样适用于保存的历史文件,因此history -d < historyfile
(或任何其他选项)可以很好地转换时间戳。
如果您使用的不仅仅是一个历史文件,这会派上用场 - 我已设置zsh
为每个 pty 保留一个历史文件,以避免混淆同一系统上并行运行的 shell 的历史(因为通常每个窗口/屏幕/. .. 是特定于某项任务的,因此从正常使用中出现的历史最终会成为某种主题)。
: 1241036430:0;cat ~/.history
‘: <beginning time>:<elapsed seconds>;<command>’.
extendedhistory - 以秒为单位节省时间。开始时间是从纪元开始。
来源:http: //zsh.sourceforge.net/Doc/Release/Options.html#index-EXTENDEDHISTORY