【发布时间】:2016-08-23 19:57:04
【问题描述】:
首先,一些背景:
我们正在使用 .bash_profile 中的代码,该代码将时间戳附加到历史命令。
export HISTTIMEFORMAT="%d/%m/%Y %T "
然后我们还有代码将我们的命令历史记录附加到 /root/history/ 中的特定位置
export HISTFILE=/root/history/.bash_hist-$(who -m | awk '{print $1}')
“export HISTTIMEFORMAT”命令会将纪元时间戳附加到 /root/history/ 中的文件中。
现在,当我们使用 perl one-liner 将 epoch 转换为人类可读时,神奇的事情发生了。 (顺便说一句,这也在 .bash_profile 中)
format_history () {
perl -i -e '$/=undef;my $string=<>;$string=~s/#([0-9] {10}.*\n.*$)/"# ".localtime($1)."#\n#$1"/ge;print $string;' /root/history/.bash_hist-$(who -m | awk '{print $1}')
}
shopt -s histappend
PROMPT_COMMAND="history -a;format_history;$PROMPT_COMMAND"
最终结果是一个文件,每个命令都包含这样的行:
# Wed Apr 27 10:11:26 2016
#1461769886
vi /root/.bash_profile
我正在寻找一种方法,让 perl 在完成转换后删除纪元时间戳,但到目前为止还没有成功。我尝试在行尾使用 sed 和另一个 perl 命令。像这样:
第一次尝试:
perl -i -e '$/=undef;my $string=<>;$string=~s/#([0-9]{10}.*\n.*$)/"# ".localtime($1)."#\n#$1"/ge;print $string;' /root/history/.bash_hist-$(who -m | awk '{print $1}' | sed '/^#1/ d'
第二次尝试:
perl -i -e '$/=undef;my $string=<>;$string=~s/#([0-9]{10}.*\n.*$)/"# ".localtime($1)."#\n#$1"/ge;print $string;' /root/history/.bash_hist-$(who -m | awk '{print $1}' | perl -i -nle 'print if !/^#1\b' /root/history/.bash_hist-$(who -m | awk '{print $1}'
但正如我所提到的,这些不起作用。谁能帮我找到解决办法?
【问题讨论】: