Thread Programmierungshilfe für PERL (9 answers)
Opened by asakalli at 2010-07-16 13:32

topeg
 2010-07-17 15:37
#139865 #139865
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Nur damit ich es richtig verstanden habe.
Du hast in einem/mehreren Verzeichnissen Dateien die Zeilen dieser Art haben:
07/17/2010 02:15:46| main|node105|W|job 56494 exceeds job hard limit "h_vmem" of queue
sobald eine Solche Zeile auftaucht soll die JobNummer und NodeNummer zwischen gespeichert werden, um sie später weiter zu verarbeiten.

Dazu ein Paar Bemerkungen:
Ich nehme mal an, nicht jede "Node" macht eine Meldung zu einem Job, aber es kann sein, das zu einer Node mehrere Jobs Meldungen machen. Wenn dem so ist ist deine Form der Speicherung sehr ineffizient. Wenn du ein Array benutzt in der Jede Node-ID ein Eintrag sein kann hast du unter Umständen sehr viele Leere Felder im Array, das ist reine Speicherverschwendung. Besser ist hier ein Hash zu benutzen. Wenn meine Vermutungen Stimmen und es mehrere Job-Meldungen zu einer Node geben kann, solltest du die Job-IDs in einem Array oder Hash speichern. Wenn ein Job sich mehrfach Melden kann Wird die Struktur noch etwas komplizierter.
Ich denke Du willst auch wissen was passiert ist. Die Meldung kannst du auch gleich mit übernehmen.

Ich würde es so anfangen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/usr/bin/perl
use strict;
use warnings;
# das Modul Data::Dumper laden
# exportiert die Funktion "Dumper"
use Data::Dumper;

# Verzeichnis in dem gesucht werden soll
my $dir='/ver1/ver2/ver3/';

# Jobs zu den Nodes in einem Hash speichern
my %node;

# alle Dateien im Verzeihnis durch gehen
for my $file (glob("$dir*"))
{
  # Datei öffnen und prüfen ob es funktioniert hat
  if(open(my $fh, '<', $file))
  {
    # Datei Zeilenweise durch gehen
    while(my $line=<$fh>)
    {
      chomp($line);
      ## Wenn eine Zeile "node" mit einer Nummer und Job mit einer Nummer zusammen mit "exeeds" auftaucht,
      ## Dann die NodeID und JobID zusammen mit der Meldung speichern.
      #$node{$1}{$2}=$3 if($line=~/node(\d+).*?job (\d+) exceeds (.+)$/);
      # das kann man auch anders schreiben:
      if(index('exceed',$line)>-1)
      {
        # zeile an den "|" spliten
        my @col=split('|', $line);
        # nodeid ermitteln
        my ($nodeid)=$col[2]=~/(\d+)/;
        # jobid ermitteln
        my ($jobid)=$col[4]=~/job\s*(\d+)/;
        # message ermitteln
        my ($message)=$col[4]=~/exceeds (.+)$/;
        # alles zusammen speichern
        $node{$nodeid}{$jobid}=$message;
      }
    }
    # Datei schließen
    close($fh);
  }
  else
  {
    # waren wenn das Öffnen der Datei fehlschlug
    warn("ERROR open $file ($!)\n");
  }
}

# Mit Dumper kann man Datenstrukturen formatiert ausgeben lassen.
# das ist ganz nützlich um zu sehen was man überhaupt an Daten hat.
print Dumper(\%node);

Der Code sollte machen was du dir wünschst.

Was deinen Code und das "for" betrifft. Das ist unsinnig. Du durchläufst immer wider den selben Code Öffnest die selben Dateien filterst sie auf die selbe Weise und übernimmst immer die selben Werte. Du bekommst also 100 mal das selbe.

View full thread Programmierungshilfe für PERL