通过执行此命令,
❯ fc -l -1 | awk 'END{print $1}'
8845
我可以看到历史文件中有 8845 条命令。我正在使用嘚,所以我的历史文件如下所示:
❯ head $HISTFILE
: 1575981231:0;exit
: 1575981278:0;git clone --depth=1 https://github.com/romkatv/powerlevel10k.git $ZSH_CUSTOM/themes/powerlevel10k
: 1575981423:0;clear
: 1575981457:0;exit
: 1575981463:0;sudo vim ~/.zshrc
: 1575981490:0;source $_
: 1575981540:0;exit
: 1575981684:0;git clone https://aur.archlinux.org/yay.git
: 1575981688:0;cd yay
: 1575981692:0;makepkg -si
所以我可以找到我的第一个命令,如下所示:
❯ head -n 1 $HISTFILE
: 1575981231:0;exit
我知道这个时间是 Unix 时间。我想以如下可读格式找出自从我在终端中输入该命令以来已经过了多少时间:2 days, 2 hours, 5 minutes, and 54 seconds
我怎样才能做到这一点?
答案1
首先,我们需要找到第一个命令的 Unix 时间,然后我们可以从当前时间中减去该时间并将其转换为人类可读的格式。
❯ awk -F: 'NR==1{print $2}' ~/.zsh_history | tr -d ' '
1575981231
此命令获取文件的第一行~/.zsh_history
,并将其与分隔符分开:
,然后打印其第二个字段,即我们需要的时间。我们还awk
通过将输出传递到来修剪多余的空格tr -d ' '
。所以现在我们有了第一个命令的时间。现在我们需要当前时间(Unix 中的时间)。这可以通过以下命令轻松完成:
❯ date +'%s'
1578207763
剩下要做的就是从当前时间中减去第一次时间并进行转换。这里有一个 bash 脚本可以完成这个任务:
#!/bin/bash
# tsfc - time since first command
function display_time {
local T="$1"
local D="$((T/60/60/24))"
local H="$((T/60/60%24))"
local M="$((T/60%60))"
local S="$((T%60))"
(( $D > 0 )) && printf '%d days, ' $D
(( $H > 0)) && printf '%d hours, ' $H
(( $M > 0)) && printf '%d minutes, ' $M
(( $D > 0 || $H > 0 || $M > 0)) && printf 'and '
printf '%d seconds\n' $S
}
first="$(awk -F: 'NR==1{print $2}' ~/.zsh_history | tr -d ' ')"
now="$(date +'%s')"
difference=$((now - first))
display_time $difference
此脚本中的函数取自Stéphane Gimenez 在 Unix.StackExchange 上的回答,以人类可读的格式显示我们给出的时间(以秒为单位)。
现在,您可以将该脚本写入文件中,使其可执行,将其复制到文件中,/usr/bin
每次运行它时,您都可以看到自在 zsh 中执行第一个命令以来经过的时间。