首先,一些背景知识:
我们正在使用.bash_profile中的代码,该代码将时间戳附加到history命令。
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将纪元转换为人类可读时,神奇就会发生。 (这,顺便说一句,也在.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}'
但正如我提到的那些不起作用。任何人都可以帮我找到解决方案吗?
答案 0 :(得分:3)
如果你不想要时代线,你为什么要写它?
None
答案 1 :(得分:2)
我不确定我是否理解正确,但为了避免打印时代,您可以尝试删除#$1
部分,如下所示:
perl -i -e '$/=undef;my $string=<>;$string=~s/#([0-9] {10}.*\n.*$)/"# ".localtime($1)."#\n"/ge;print $string;' /root/history/.bash_hist-$(who -m | awk '{print $1}')
答案 2 :(得分:2)
扩展你的单行以使其更具可读性......
#!/usr/bin/env perl -i
$/=undef;
my $string = <>;
$string =~ s{#([0-9] {10}.*\n.*$)}{"# ".localtime($1)."#\n#$1"}ge;
print $string;
$1
是您捕获的原始纪元时间。在正则表达式的替换(右侧)上,您将$1
传递到localtime
,但也将其放回到#$1
的字符串中。所以不要。删除#$1
。