【问题标题】:Perl one liner to convert epoch to human readable then remove epochPerl 一个班轮将纪元转换为人类可读然后删除纪元
【发布时间】: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}'

但正如我所提到的,这些不起作用。谁能帮我找到解决办法?

【问题讨论】:

    标签: bash perl awk sed


    【解决方案1】:

    我不确定我是否理解正确,但为避免打印 epoch,您可以尝试删除 #$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】:

      如果你不想要纪元线,你为什么要写它?

      format_history () {
          local file=/root/history/.bash_hist-$LOGNAME
          perl -i -pe 's/^#(\d{10})$/"# ".localtime($1)/e' "$file"
      }
      

      【讨论】:

        【解决方案3】:

        扩展你的单行使其更具可读性...

        #!/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。

        【讨论】:

          猜你喜欢
          • 2021-06-21
          • 2021-02-19
          • 2012-08-16
          • 2012-07-16
          • 1970-01-01
          • 2013-01-13
          • 2012-11-12
          • 2017-05-23
          • 2019-12-03
          相关资源
          最近更新 更多