In 10 Minuten Excel-Reports mit Perl erstellen
Digicomp-Trainer Renato Testa erklärt, wie Sie mit Perl ganz einfach Systeminformationen in Excel darstellen, Formeln anwenden und formatieren.
Jeder Administrator kennt die Situation, dass Informationen eines oder mehrerer Systeme schnell gesammelt und in einer Tabelle dargestellt werden müssen. Welcher Container (LXC oder Docker) braucht wieviel RAM, CPU, Network Load und vieles mehr… Dank der Transparenz von unixoiden Systemen, ist es kein Problem diese Informationen zu finden.
Aber oft ist dann eine Excel-Tabelle gefragt. Solche Ad-Hoc-Übungen sind dank mächtigen Unix-Werkzeugen mit einem Aufwand von 10 bis 30 Minuten machbar.
Dank dem Perl-Modul «Excel::Writer::XLSX» ist dies kein Problem. Die Installation erfolgt wie immer mittels:
sudo perl -MCPAN -e 'install Excel::Writer::XLSX'
Ein einfaches Beispiel
Das folgende Beispiel zeigt, wie einfach es ist:
#!/usr/bin/perl
use strict;
use warnings;
use Excel::Writer::XLSX;
my $workbook = Excel::Writer::XLSX->new( 'test1.xlsx' );
my $worksheet = $workbook->add_worksheet();
$worksheet->write( "A1", "Hallo Excel!" );
$worksheet->write( "A2", "eine 2. Zeile" );
$workbook->close;
Mittels der Methode «new» konstruieren wir ein neues Objekt. Wenig überraschend wird mittels «add_worksheet» ein neues Worksheet kreiert. Anschliessend wird mittels «write» neuer Content zu unserem Worksheet hinzugefügt. Dann wird das Workbook mit «close» geschlossen.
Et voilà:
Formeln
Ein häufig benutztes Feature von Excel sind Formeln. Zum Beispiel:
#!/usr/bin/perl
use strict;
use warnings;
use Excel::Writer::XLSX;
my $workbook = Excel::Writer::XLSX->new( 'test2.xlsx' );
my $worksheet = $workbook->add_worksheet();
$worksheet->write( "A1", 27 );
$worksheet->write( "A2", 34 );
$worksheet->write( "A3", "=A1+A2" );
$worksheet->write( "A4", "=SUM(A1:A3)" );
$workbook->close;
Und das Resultat:
Formatierung
Personen, speziell aus dem Management, haben es gerne formatiert bzw. bunt in solchen Reports. Auch dies stellt für das Modul keine Hürde dar:
#!/usr/bin/perl
use strict;
use warnings;
use Excel::Writer::XLSX;
my $a = 27;
my $b = 34;
my $workbook = Excel::Writer::XLSX->new( 'test3.xlsx' );
my $worksheet = $workbook->add_worksheet();
my $error_format = $workbook->add_format(
color => 'red',
);
$worksheet->write( "A1", $a );
if ( $b >= 30 ) {
$worksheet->write( "A2", $b, $error_format );
} else {
$worksheet->write( "A2", $b );
}
$workbook->close;
Via die Methode «add_format» definieren wir beliebige Formatierungen.
Das Resultat:
Ein praktisches Beispiel
Das Kommando «docker stats –no-stream» liefert uns Zeilen (1/Container) in der Form:
NAME CPU % MEM USAGE / LIMIT MEM % NET I/O
aldebaran 1.84% 1.111 GB/5.064 GB 2.19% 3.51 GB/13.83 MB
...
Je nach docker-Version kann der Output variieren. Praktisch wäre nun eine Excel-Tabelle mit diesen Werten, um z.B. den gesamten Verbrauch an Memory zu berechnen.
Container, welche die max. Limite an Memory übersteigen, hätten wir gerne rot markiert – und am Schluss das Total der CPU- und Memory-Usage.
#!/usr/bin/perl
use strict;
use warnings;
use Excel::Writer::XLSX;
my @title = ( "NAME", "CPU %", "MEM USAGE", "LIMIT", "MEM %", "NET RX", "Net TX" );
my $col = 0;
my $row = 1;
my $workbook = Excel::Writer::XLSX->new( 'test4.xlsx' );
my $worksheet = $workbook->add_worksheet();
my $error_format = $workbook->add_format(
color => 'red',
);
# write the title. NOTE: we use coordinates e.g. 0,0 is A1, A2 is 1,0, B1 is 0,1
for ( my $i=0; $i <= $#title; $i++ ) {
$worksheet->write( 0, $i, "$title$i" );
}
# we read stdinput which comes from "docker stats --no-stream" via pipe
while ( <> ) {
s/kMG?B\/?/ /g; # replace unwanted stuff by ' '
my @line = split ( /\s+/ );
for ( my $i=0; $i <= $#line; $i++ ) {
$line$i =~ s/%//;
if ( $i == 2 and $line$i >= $line$i+1 ) { # print in red if MEM USAGE is > MEM MAX
$worksheet->write( $row, $i, "$line$i", $error_format );
} else {
$worksheet->write( $row, $i, "$line$i" );
}
}
$row++;
}
$worksheet->write( $row, 0, "Total" );
$worksheet->write( $row, 1, "=SUM(B2:B" . $row . ")" );
$worksheet->write( $row, 2, "=SUM(C2:C" . $row . ")" );
$workbook->close;
Und das Ergebnis:
Zusammenfassung
- Perl zu kodieren macht wohl mehr Spass als Excel anzuwenden und copy&paste-Orgien zu durchlaufen.
- Aber, wie immer, wir befriedigen auch solche (exotischen?) Wünsche.
- Der Aufwand solcher ad-hoc-Lösungen ist minimal.
- Das Management ist glücklich.
Programmieren mit Perl («UWP»)Lernen Sie im Kurs einfache Perl-Scripte zu schreiben, Perl-Module anzuwenden, bestehende Perl-Programme zu modifizieren und einfache Web-Applikationen zu programmieren. |
Lernen Sie im Kurs einfache Perl-Scripte zu schreiben, Perl-Module anzuwenden, bestehende Perl-Programme zu modifizieren und einfache Web-Applikationen zu programmieren.