• 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

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
 
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
 
Muss das nicht irgenwie so aussehen:
Code:
...
if($_ =~ $ip){
print $_;} 
...

(Bin kein Perl-Spezi...)


Stefan
 
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.
 
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 $_; }
}
 
Jetzt fehlt im das richtige Package noch und bei /195 ..... hat er noch was einzuwenden

ABer daran sollt es nicht scheitern!

Danke vielmals.

Mfg
 
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"
 
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
 
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/)"
 
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