• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Perl script soll /var/log/messages einlesen und Ip ausgeben

byron1778

Hacker
Hallo Leute,

ich versuche mir ein Script zusammenzubasteln, welches mir die /var/log/messages durchsucht und dabei eine bestimmte IP ausgibt (in meinem Fall alle IP´s die anfangen mit 195.34.133).

Leider haut das Ganze aber nicht so in wie ich es gerne möchte!

#!/usr/bin/perl -w

use strict;
use warnings;

my $messages = "/var/log/messages";
my $ip = "195.34.133.";

open($messages,"$messages") or die $!;
while (<$messages>){
if($ip){
print $_;}
close($messages);
}

Kann mir jemand vielleicht sagen wo genau der Fehler drinnen steckt bzw es richtig stellen?

Vielen Danke und mfg

Bernd
 
OP
B

byron1778

Hacker
Hallo,

da hast du recht, wollte es nur mit Perl realisieren das Ganze.

Natürlich geht es auch anders :)

Vielleicht eine Idee wie ich es mit meiner Methode hinbekomme?

Vielen Dank u.

mfg
Bernd
 

snaewe

Hacker
Muss das nicht irgenwie so aussehen:
Code:
...
if($_ =~ $ip){
print $_;} 
...

(Bin kein Perl-Spezi...)


Stefan
 
OP
B

byron1778

Hacker
Hallo,

er bringt dann beim Kompilieren folgende Fehlermeldung!

Name main:message used only one, possibly typo at line 10
CAnt use string /var/log/message as symbol ref while "strict refs" in use at line 9.
 

rodhel

Newbie
Ich kenne es nur so

(ip-adresse direkt reingeschrieben, da bei variablen in /.../ evt. eval verwendet werden muss.)


#!/usr/bin/perl -w

my $messages = "/var/log/messages";

open(MSG,"$messages") or die $!;
@line = <MSG>;
close (MSG);

foreach (@line) {
if (/195\.34\.133\./) { print $_; }
}
 
OP
B

byron1778

Hacker
Jetzt fehlt im das richtige Package noch und bei /195 ..... hat er noch was einzuwenden

ABer daran sollt es nicht scheitern!

Danke vielmals.

Mfg
 

regexer

Advanced Hacker
So funktioniert es:
Code:
#!/usr/bin/perl -w

use strict;
use warnings;

my $messages='/var/log/messages';
my $ip='192\.168\.1\.';     # einfache Hochkommas wichtig

open (MSG,"<$messages") || die $!;
while (<MSG>) {
  print if (/$ip/);
}
Bei der variablen $ip sind die einfachen Hochkommas wichtig, da sonst die Backslashes während der Zuweisung verschwinden. Alternativ würde gehen:
Code:
my $ip="192\\.168\\.1\\.";
Andernfalls findet die Abfrage auch "192x168x1x"
 
OP
B

byron1778

Hacker
Hallo,

danke Dir vielmals.

Habe gestern auch noch eine andere Möglichkeit gefunden, obwohl der Code von mir natürlich um vieles länger ist.

Werde Deinen dann auch sofort ausprobieren!

Mfg
 

regexer

Advanced Hacker
snaewe schrieb:
Muss das nicht irgenwie so aussehen:
Code:
...
if($_ =~ $ip){
print $_;} 
...
Nicht zwingend! Viele Perl-Befehle greifen Standardmäßig auf $_ zu, wenn man keine Varialbe angibt.

Also ist "print $_" und "print" identisch.
Ebenso "if ($_=~/$ip/)" und "if (/$ip/)"
 

regexer

Advanced Hacker
byron1778 schrieb:
Jetzt fehlt im das richtige Package noch und bei /195 ..... hat er noch was einzuwenden
Das ist es nicht! Wenn du die Lösung von rodhel verwenden willst, musst du entweder vor @line=<MSG> den Befehl "my" setzen, oder du darfst "use strict" nicht verwenden.

"use strict" bewirkt nämlich, dass jede Varialbe (in diesem Fall sogar ein Array) vor der ersten Benutzung mit "my" definiert werden muss. Wenn du "use strict" weglässt, werden Felder einfach bei der ersten Benutzung geboren - ähnlich wie bei BASIC.
 
Oben