2016-04-28 13 views
1

Zunächst einige Hintergrundinformationen:Perl Einzeiler Epoche zu Menschen lesbaren umwandeln dann Epoche entfernen

Wir Code in unserem Bash_profile verwenden, die einen Zeitstempel in die Geschichte Befehl anhängt.

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

Dann haben wir auch Code, der in/root/Geschichte unserer Befehlsverlauf zu einer bestimmten Stelle anfügt/

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

Der „Export HISTTIMEFORMAT“ Befehl wird die Unix-Zeitstempel in die Datei in anhängen/Wurzel/Geschichte /.

Jetzt passiert die Magie, wenn wir einen Perl-Einzeiler verwenden, um die Epoche zum Menschen lesbar umzuwandeln. (This, btw, ist auch in .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" 

Das Endergebnis ist eine Datei, die für jede Befehlszeilen wie folgt enthält:

# Wed Apr 27 10:11:26 2016 
#1461769886 
vi /root/.bash_profile 

ich nach einem Weg suchen Perl entfernen haben der Epochen-Zeitstempel ist einmal fertig konvertiert, aber bisher nicht erfolgreich. Ich habe versucht, sed am Ende der Zeile und einen anderen Perl-Befehl. Wie folgt aus:

Erster Versuch:

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' 

Zweiter Versuch:

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}' 

Aber wie gesagt ich diese nicht funktionieren. Kann mir jemand helfen, eine Lösung zu finden?

Antwort

3

Wenn Sie die Epoche Linie nicht wollen, warum schreibst du es?

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

Ich bin mir nicht sicher, ob ich Sie richtig verstehe, aber Druck Epoche zu vermeiden, kann man versuchen, den #$1 Teil zu entfernen, wie folgt aus:

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

Ihre Einzeiler Erweiterung, um es besser lesbar etwas zu machen ...

#!/usr/bin/env perl -i 

$/=undef; 
my $string = <>; 
$string =~ s{#([0-9] {10}.*\n.*$)}{"# ".localtime($1)."#\n#$1"}ge; 
print $string; 

$1 ist die ursprüngliche Epoche Zeit, die Sie gefangen. Auf der Ersatz- (rechten) Seite der Regex übergeben Sie $1 in localtime, sondern auch wieder in die Zeichenfolge mit #$1. Also nicht. Entfernen Sie #$1.

Verwandte Themen