Perl one liner将epoch转换为人类可读,然后移除纪元

时间:2016-04-28 20:40:19

标签: bash perl awk sed

首先,一些背景知识:

我们正在使用.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}'

但正如我提到的那些不起作用。任何人都可以帮我找到解决方案吗?

3 个答案:

答案 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