2016-04-28 4 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.

Смежные вопросы