使用 awk 转换时间戳
如果您想读取文件本身,与grep 或任何其他过滤器一起使用,您需要转换时间戳。
我制作了这个脚本,并将它保存在我的/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
在这种情况下,duration 不会出现,但其余部分相同。