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

[Solved] String in integer umwandeln

byron1778

Hacker
Hallo Forum!

Ich habe folgendes Problem.
In einer Datei gibt es tausende Zeilen, die so aufgebaut sind

Code:
64 bytes from orc2 (10.117.230.122): icmp_seq=0. time=1.05 ms
15.12_15:03:51
64 bytes from orc2 (10.117.230.122): icmp_seq=1. time=0.428 ms
15.12_15:03:52
64 bytes from orc2 (10.117.230.122): icmp_seq=2. time=0.528 ms
15.12_15:03:53
64 bytes from orc2 (10.117.230.122): icmp_seq=3. time=0.475 ms
64 bytes from orc2 (10.117.230.122): icmp_seq=3. time=0.475 ms
15.12_15:03:54

Gelegentlich kommen Pings doppelt vor (ein Fehler, den wir derzeit suchen!).
Ich will nun alle Zeilen mit icmp filtern und die doppelten Eintraege heraussuchen.
Sobald ich einen doppelten Eintrag gefunden habe, will ich das Datum, das eine Zeile weiter steht, mitausgeben!

Wie ich den doppelten Eintrag finden kann, das habe ich schon herausen, wie ich die naechste Zeile, also das Datum mitnehmen kann, bekomme ich nicht hin!

So sieht das Modul fuer den doppelten Eintrag aus

Code:
#!/bin/perl -w

@b=();

open(IN,"</tmp/pingorc2.log");

while ($line = <IN>) {
        if ($line =~ /icmp/) {
                @a=split("=",$line);
                push(@b, "$a[1]");
        }
}
close IN;

foreach my $key (@b) {
$HASH{$key}++ ;
}

open(IN,">/sequenznummer.txt");
foreach my $key (keys %HASH) {
        print IN "$key: \n" if ($HASH{$key}>1) ;
}
close IN;

open(IN,"</sequenznummer.txt");
while ($line = <IN>) {
        if ($line =~ /time/) {
        @a=split(/\./,$line);
        push(@x, "$a[0]");
}
}
close IN;

foreach (@x){
print "$_\n";
}

Fuer das Problem mit der naechsten Zeile ergibt sich jedoch immer folgende Fehlermeldung, obwohl ich es schon versucht habe mit casten!

Code:
Use of uninitialized value in pattern match (m//) at ./seq.pl line 16, <$fh> line 128624.
Argument "15.12_15:10:17" isn't numeric in int at ./seq.pl line 15, <$fh> line 128626.

Hier der Code des Moduls, wo das casten nicht richtig funktioniert?!?!

Code:
#!/bin/perl -w

use Tie::File;

my $filename = '/tmp/pingorc2.log';
tie my @aapl, 'Tie::File', $filename or die "Can't tie '$filename' $!";

#for my $i (0..$#aapl) {
$anzahl = $#aapl;

for ($i=0; $i<=$anzahl; $i++) {
        if ( $aapl[$i] =~ /icmp/ ) {
                my $price = $1;
                $string = $aapl[$i + 11];
                $appl = int($string);
                if ($aapl =~ /\d*.\d*/) {
                        $id = $1;
                        print "$id\n";
                }
        }
}

Wenn mir jemand vll. weiterhelfen koennte, wo im letzten Modul der Fehler genau liegt.
bzw. wie ich den Code veraendern muss, damit es funktioniert!

Danke Euch schon im voraus vielmals!
 

framp

Moderator
Teammitglied
Ich würde die doppelten Zeilen wir folgt raussuchen:
Code:
#!/usr/bin/perl -w
use strict;
my $seq=-1;

while (<>) {
        if (/icmp_seq=(\d+)/) {
                if ($seq == $1) {
                        my $time=<>;
                        print "Seq: $seq: $time";
                }
                $seq=$1;
        }

}
 
OP
B

byron1778

Hacker
Danke Dir vielmals!

Die doppelten Zeilen weiss ich schon, es ging darum, dass ich nach einer gefundenen doppelten Zeile auch das dazugehoerige Datum brauche.
Dafuer habe ich nun die Loesung, jetzt muss ich nur mehr das Modul mit den doppelten gefundenen Zeilen und dem Datum zusammenfuehren

So sieht das Datum aus

Code:
#!/bin/perl -w

use Tie::File;

my $filename = '/tmp/pingorc2.log';
tie my @aapl, 'Tie::File', $filename or die "Can't tie '$filename' $!";

#for my $i (0..$#aapl) {
$anzahl = $#aapl;

# _15:04:19

for ($i=0; $i<=$anzahl; $i++) {
        if ( $aapl[$i] =~ /icmp/ ) {
                my $price = $1;
                $aapl = $aapl[$i + 1];
                if ($aapl =~ /(\d{2}\.\d{2}\_\d{2}\:\d{2}\:\d{2})/) {
                        $id = $1;
                        print "$id\n";
                }
        }
}

So sieht die doppelt gefundene Zeile aus

Code:
#!/bin/perl -w

use Tie::File;

@b=();

open(IN,"</tmp/pingorc2.log");

while ($line = <IN>) {
        if ($line =~ /icmp/) {
                @a=split("=",$line);
                push(@b, "$a[1]");
        }
}
close IN;

foreach my $key (@b) {
$HASH{$key}++ ;
}

open(IN,">/thales/scripts/sequenznummer.txt");
foreach my $key (keys %HASH) {
        print IN "$key: \n" if ($HASH{$key}>1) ;
}
close IN;

open(IN,"</thales/scripts/sequenznummer.txt");
while ($line = <IN>) {
        if ($line =~ /time/) {
        @a=split(/\./,$line);
        push(@x, "$a[0]");
}
}
close IN;

foreach (@x){
print "$_\n";
}

Vll. eine Idee wie ich beide Module zusammenfuehren kann, damit am Ende dann es ungefaehr so aussehen kann

Code:
doppelte sequennummer: 1234  Datum:15:12_xxx
 
OP
B

byron1778

Hacker
War schon komplett neben der Spur, danke Dir vielmals fuer Deine Hilfe!

Dachte mir dein Script waere nur eine Hilfestellung ... ich sollte besser nachhause gehen :)

Danke Dir vielmals!
 
Oben