2016-08-04 14 views
0

Ich brauche Hilfe, ich habe eine Ausgabe von einem Befehl und müssen nur die Zeit, d. H. "10:57:09" aus dem Ausgang extrahieren.Wie Regex in Perl zu verwenden

Der Befehl lautet: tail -f /var/log/sms

Befehlsausgabe:

Thu 2016/08/04 10:57:09 gammu-smsd[48014]: Read 0 messages 

wie könnte ich dies in Perl zu tun und das Ergebnis in die Variable

Danke

Antwort

0

Perl-Code:

$txt = "Thu 2016/08/04 10:57:09 gammu-smsd[48014]: Read 0 messages"; 
$txt =~ /(\d{2}:\d{2}:\d{2})/; 
print $1; # result of regex 
print "\n"; # new line 

Und es druckt:

10:57:09 

Das Ergebnis geht auf eine Variable $1 aufgrund der Erfassung Klammer genannt. Hätte es mehr gewesen Capturing runde Klammer ihren erfassten Text int $2 gesetzt haben würde, $3 etc ...

EDIT

Um die Linie von der Konsole zu lesen, in dem obigen Skript verwenden:

$txt = <STDIN>; 

Nun nehmen wir das Skript myscript.pl genannt wird, führen tail etwa so:

tail -f /var/log/sms | myscript.pl 
+0

es funktioniert .... Ich brauche noch etwas, wie coud i tail -f/var/log/sms ausführen in Script Perl um den Txt zu bekommen ?? – wael

+0

@wael: Siehe [meine Antwort] (http://stackoverflow.com/a/38762344/7231). Aber wirklich, das ist alles ziemlich einfaches Zeug. Hast du irgendwelche [Perl Bücher] (http: //learn.perl.org/books /) oder irgendwelche [Perl Tutorials] (http://perl-tutorial.org/) genommen haben, bevor Sie dies versuchen? –

+0

@wael sehe meine Bearbeitung an die Anser –

0

Normalerweise würden wir erwarten, dass Sie einige Beweise dafür vorlegen, dass Sie versuchen, das Problem selbst zu lösen, bevor Sie eine Antwort geben.

Sie verwenden den Match-Operator (m/.../), um zu überprüfen, ob eine Zeichenfolge mit einem regulären Ausdruck übereinstimmt. Die m wird oft weggelassen, so dass Sie es als /.../ geschrieben sehen. Standardmäßig stimmt es mit der Variablen $_ überein, aber Sie können dies ändern, indem Sie den Bindungsoperator =~ verwenden. Wenn eine Regex Klammern enthält ((...)), dann wird alles, was mit diesem Abschnitt der Regex übereinstimmt, in $1 (und $2, $3 usw. für nachfolgende Klammern) gespeichert. Diese "erfassten" Werte werden auch vom Vergleichsoperator zurückgegeben, wenn er im Listenkontext ausgewertet wird.

Es ist immer eine gute Idee, den Rückgabewert des Match-Operators zu überprüfen, da Sie höchstwahrscheinlich verschiedene Aktionen ausführen möchten, wenn das Match nicht erfolgreich war.

Weitere Details zum Match-Operator und perldoc perlre finden Sie unter perldoc perlop für weitere Details zu Perls Regex-Unterstützung.

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

$_ = 'Thu 2016/08/04 10:57:09 gammu-smsd[48014]: Read 0 messages'; 

if (my ($time) = /(\d\d:\d\d:\d\d)/) { 
    say "Time is '$time'"; 
} else { 
    say 'No time found in string'; 
} 

und die Daten von externen Prozess zu bekommen ...

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

open my $tail_fh, 'tail -f /var/log/sms |' or die $!; 
while (<$tail_fh>) { 
    if (my ($time) = /(\d\d:\d\d:\d\d)/) { 
    say "Time is '$time'"; 
    } else { 
    say 'No time found in string'; 
    } 
} 
+0

Ich habe dieses Skript versucht, aber es fest .. zeigt kein Ergebnis – wael

+0

Sie haben Recht. Mein Code war zu einfach. Jetzt behoben. –

+1

[Was soll ich tun, wenn jemand meine Frage beantwortet?] (Http://stackoverflow.com/help/someone-answers). Sie scheinen keine Antworten auf Ihre Fragen akzeptiert zu haben. Wenn du das nicht tust, werden die Menschen irgendwann aufhören, dir zu helfen. –