2016-04-28 44 views
1

首先,一些背景:Perl的一個班輪時代轉換爲人類可讀然後取出劃時代

我們正在使用的代碼在我們的.bash_profile是追加時間戳的歷史命令。

export HISTTIMEFORMAT="%d/%m/%Y %T " 

那麼我們也有一個附加我們的命令歷史記錄上的特定位置/根/歷史碼/

export HISTFILE=/root/history/.bash_hist-$(who -m | awk '{print $1}') 

「出口HISTTIMEFORMAT」命令將時代時間戳附加到文件/根/歷史/。

現在,當我們使用Perl單線程將時代轉換爲人類可讀時,就會發生奇蹟。 (這,順便說一句,也就是在.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

如果你不想劃時代線爲什麼,你在寫嗎?

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

擴展了您的一個班輪讓它多一點可讀性...

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

相關問題