Hallo,
wie mache ich aus einer dhcp.conf eine csv-Datei, in der alle
host xxxx { hardware ethernet 00:00:00:00:00:00; fixed-address 192.168.200.71; }
Einträge zeileweise abgebildet werden:
xxxx,00:00:00:00:00:00,192.168.200.71
Ich kann bissel Perl, php, und bash. auch awk habe ich schon mal gesehen - nur es gebricht mir am Ansatz :-( Danke!
Mit freundlichen Grüßen
Jens Puruckherr
Am Donnerstag, dem 05. September 2002 um 20:18:52, schrieb Jens Puruckherr:
wie mache ich aus einer dhcp.conf eine csv-Datei, in der alle
host xxxx { hardware ethernet 00:00:00:00:00:00; fixed-address 192.168.200.71; }
Einträge zeileweise abgebildet werden:
xxxx,00:00:00:00:00:00,192.168.200.71
dhcp.pl:
#!/usr/bin/perl
while (<>) { next unless /host (\S+)/; print "$1,"; <> =~ /hardware ethernet (\S+);/; print "$1,"; <> =~ /fixed-address (\S+);/; print "$1\n"; }
$ perl dhcp.pl /etc/dhcp.conf
Torsten
On Thu, Sep 05, 2002 at 08:18:52PM +0200, Jens Puruckherr wrote:
Hallo,
wie mache ich aus einer dhcp.conf eine csv-Datei, in der alle
host xxxx { hardware ethernet 00:00:00:00:00:00; fixed-address 192.168.200.71; }
Einträge zeileweise abgebildet werden:
xxxx,00:00:00:00:00:00,192.168.200.71
Ich kann bissel Perl, php, und bash. auch awk habe ich schon mal gesehen - nur es gebricht mir am Ansatz :-( Danke!
Perl ..... danke für den Wink:
Folgende Lösung geht davon aus, dass jeder Host nur eine Ethernetadresse und nur eine IP-Adresse hat.
++++ dhcp2csv.py: #!/usr/bin/env python
import sys import re
fd=open(sys.argv[1]) while 1: host=None line=fd.readline() if not line: break match=re.match(r'.*host ([a-zA-Z0-9.]*)', line) if match: host=match.group(1) ethernet=None address=None while 1: line=fd.readline() if not line: break match=re.match(r'.*ethernet *([0-9:]*)', line) if match: ethernet=match.group(1) else: match=re.match(r'.*fixed-address *([0-9.]*)', line) if match: address=match.group(1) if address and ethernet: break if host: print("%s,%s,%s" % (host, ethernet, address))
+++ dhcp.txt: host xxxx { hardware ethernet 00:00:00:00:00:00; fixed-address 192.168.200.71; }
host xxxx2 { hardware ethernet 00:00:00:00:00:00; fixed-address 192.168.200.71; }
++++ Ergebnis: ==guettli@sonne:~/dhcp-csv-lug-dd$ python dhcp2csv.py dhcp.txt xxxx,00:00:00:00:00:00,192.168.200.71 xxxx2,00:00:00:00:00:00,192.168.200.71
Hallo Thomas, lug-dd@schlittermann.de writes:
Folgende Lösung geht davon aus, dass jeder Host nur eine Ethernetadresse und nur eine IP-Adresse hat.
Jaja, richtig. Die schweren Fälle werden anders behandelt.
#!/usr/bin/env python
Achherrje, das bringsch noch nicsch. Aber Danke.
Ach habe mich abends dann doch noch an den LAptop gesetzt und ein wenig geübt:
#!/usr/bin/perl use strict; use warnings;
my @match; my $z; my $line;
open(OUT,"> data.out") || die ("Ausgabefile nicht zu öffnen"); while(<>){
$z =$_; $z =~ s/^\s+//; #Leerzeichen entfernen $z =~ s/;//; #Semikolon entfernen $z =~ s/{//; #endklammer entfernen $z =~ s/^\s+//; #nochma Leerzeichen entfernen if($z =~ /host/){ @match=split(" ",$z); $line = "$match[1],"; print OUT "$match[1],"; } if($z =~ /ethernet/){ @match=split(" ",$z); $line = "$line$match[2],"; print OUT "$match[2],"; } if($z =~ /fixed-addres/){ @match=split(" ",$z); $line = "$line$match[1]"; print OUT "$match[1]\n"; }
} close(OUT);
Das Ergebnis sieht genauso aus, wie bei dir Das Script ist zwar nicht elegant, aber tut. Nun muss ich nur noch die Einträge in der csv-Datei rumdrehen, dass der letzte in der Zeile, der erste ist, vornedran einen leeren Eintrag und ab in die DB.....
Mit freundlichen Grüßen
Jens Puruckherr IT/Webshop
--------------------------------------------- cyberport.de GmbH Versandhaus für Technik & Lifestyle
Am Brauhaus 5 01099 DRESDEN Fon: +49 (0)351/ 33 95 -7808 Fax: +49 (0)351/ 33 95 -799 Webseite: http://www.cyberport.de --------------------------------------------
Am Donnerstag, dem 05. September 2002 um 22:43:26, schrieb Thomas Guettler:
++++ dhcp2csv.py:
Bei der Länge des Python-Skript ist es ja schneller, die ursprüngliche Datei dhcp.conf abzutippen... ;-)
Ich hänge mal eine verbesserte Version meines Skriptes an, die mit Kommentaren und Leerzeilen korrekt umgeht:
---------------------------------------------- #!/usr/bin/perl
use strict; use warnings; use English;
while(<>) { s/#.*//; next unless /host (\S+)/; print "$1,"; $ARG = <> until /hardware ethernet (\S+);/; print "$1,"; $ARG = <> until /fixed-address (\S+);/; print "$1\n"; } ----------------------------------------------
Torsten
On Thu, Sep 05, 2002 at 08:18:52PM +0200, Jens Puruckherr wrote:
Hallo,
Hi Jens,
wie mache ich aus einer dhcp.conf eine csv-Datei, in der alle
host xxxx { hardware ethernet 00:00:00:00:00:00; fixed-address 192.168.200.71; }
Einträge zeileweise abgebildet werden:
xxxx,00:00:00:00:00:00,192.168.200.71
Ich kann bissel Perl, php, und bash. auch awk habe ich schon mal gesehen - nur es gebricht mir am Ansatz :-(
Du bildest deine Vorangehensweise einfach auf ein Shell/Perl/Bash-Script ab. Als erstes würde ich Zeile für Zeile die dhcp.conf durchgehen. Sobald ich auf das Schlüsselwort 'host' treffe, teile ich diese Zeile in 3 Teile, wobei der Separator Leerzeichen sind. Der 2. Teil enthält nun den Hostnamen, den man einem temporären String zuweist. Jetzt geht man in der Datei weiter, bis man auf das Schlüsselwort 'hardware' trifft. Man zerteilt wieder die Zeile und hängt den 3. Teil an den temporären String (mit Komma separiert) an. Das gleiche macht man mit der 'fixed-address' Zeile. Nun wo man alle Werte in dem temporären String hat, schreibt man diesen in eine Datei und das Spiel beginnt von vorn. In Perl würden das ca. 30 Zeile Code sein (ja, ein Guru würde es auch in 2 schaffen), die Implementation überlasse ich dir, da meine Perl-Kenntnisse bei 'Hello World' aufhören...
Ciao, Tobias
Jens Puruckherr wrote:
Hallo,
wie mache ich aus einer dhcp.conf eine csv-Datei, in der alle
host xxxx { hardware ethernet 00:00:00:00:00:00; fixed-address 192.168.200.71; }
Natuerlich mit awk.
cat dhcp.cnf | gawk -f adressen.awk
*oder*
gawk -f adressen.awk dhcp.cnf
(damit ich nicht fuer den "Useless Use Of cat Award" vorgeschlagen werde :-))
stefan2@platon:~/awk_material> gawk -f adressen.awk dhcp.conf xxxx1,00:00:00:00:00:00,192.168.200.71 xxxx2,00:00:00:00:00:00,192.168.200.72 xxxx3,00:00:00:00:00:00,192.168.200.73 xxxx4,00:00:00:00:00:00,192.168.200.74
Listing adressen.awk
------------------------ cut here ---------------------
/host/ { start = 1; ende = 0; hostname = $2; }
/hardware/ { eth = $3; }
/fixed/ { fixed = $2; gsub(/;/,"",eth); gsub(/;/,"",fixed); printf("%s,%s,%s\n",hostname,eth,fixed); }
Da war noch etwas Ueberfluessiges vom ersten Versuch drin: neues Listing adressen.awk
------------------------ cut here ---------------------
/host/ { hostname = $2; }
/hardware/ { eth = $3; }
/fixed/ { fixed = $2; gsub(/;/,"",eth); gsub(/;/,"",fixed); printf("%s,%s,%s\n",hostname,eth,fixed); }
------------------------ cut here ---------------------
stefan2@platon:~/awk_material> gawk -f adressen.awk dhcp.conf xxxx1,00:00:00:00:00:00,192.168.200.71 xxxx2,00:00:00:00:00:00,192.168.200.72 xxxx3,00:00:00:00:00:00,192.168.200.73 xxxx4,00:00:00:00:00:00,192.168.200.74
Hallo,
hier ein etwas cryptische Ansatz, der
a) davon ausgeht, daß die Datei nicht zuu riesig ist (weil sie erstmal komplett eingelesen wird)
b) davon ausgeht, daß die Datei syntaktisch korrekt ist (also ich prüfe nicht die Ethernet-Adressen und die IP-Adressen auf Korrektheit)
wie mache ich aus einer dhcp.conf eine csv-Datei, in der alle
host xxxx { hardware ethernet 00:00:00:00:00:00; fixed-address 192.168.200.71; }
#! /usr/bin/perl $_ = join("", <STDIN>); while (/^\s*host\s+(\w+)+\s+{\s+ hardware\ ethernet\ ([[:xdigit:]:]+);\s+ fixed-address\ ([\d.]+);.*?}/ixgsm) { print "$1,$2,$3\n"; }
Heiko
Am Freitag, 6. September 2002 09:42 schrieb Heiko Schlittermann:
#! /usr/bin/perl $_ = join("", <STDIN>);
was macht dieses Zeile???
while (/^\s*host\s+(\w+)+\s+{\s+ hardware\ ethernet\ ([[:xdigit:]:]+);\s+ fixed-address\ ([\d.]+);.*?}/ixgsm) { print "$1,$2,$3\n"; }
Jungs, ihr seit Klasse! Hat schon mal jemand über das Best-Of nachgedacht?
Mit freundlichen Grüßen
Jens Puruckherr
adressen.awk
------------------------ cut here ---------------------
/host/ { hostname = $2; }
/hardware/ { eth = $3; }
/fixed/ { fixed = $2; gsub(/;/,"",eth); gsub(/;/,"",fixed); printf("%s,%s,%s\n",hostname,eth,fixed); }
------------------------ cut here ---------------------
stefan2@platon:~/awk_material> gawk -f adressen.awk dhcp.conf xxxx1,00:00:00:00:00:00,192.168.200.71 xxxx2,00:00:00:00:00:00,192.168.200.72 xxxx3,00:00:00:00:00:00,192.168.200.73 xxxx4,00:00:00:00:00:00,192.168.200.74
Am Freitag, dem 06. September 2002 um 10:18:55, schrieb Stefan Lagotzki:
adressen.awk
Die Idee mit awk ist tatsächlich die eleganteste bisher, aber mit perl wird das gleiche zum übersichtlichen Vierzeiler (inklusive Kommentarbehandlung):
-------- dhcp.pl ------------------------------------- s/#.*//; $host = $1 if /host (\S+)/; $mac = $1 if /hardware ethernet (\S+);/; print "$host,$mac,$1\n" if /fixed-address (\S+);/; -------- dhcp.pl -------------------------------------
Aufrufen mit 'perl -n dhcp.pl /etc/dhcp.conf .
Torsten
Torsten Werner wrote:
Die Idee mit awk ist tatsächlich die eleganteste bisher, aber mit perl wird das gleiche zum übersichtlichen Vierzeiler (inklusive Kommentarbehandlung):
Mit awk brauche ich auch nur vier Zeilen :-)
----------------------------- cut here ----------------------------- {gsub(/;/,"");} /host/ {hostname = $2;} /hardware/ {eth = $3;} /fixed/ {fixed = $2; printf("%s,%s,%s\n",hostname,eth,fixed);} ----------------------------- cut here -----------------------------
Stefan
.
Am Samstag, dem 07. September 2002 um 13:08:14, schrieb Jens Puruckherr:
Am Freitag, 6. September 2002 09:42 schrieb Heiko Schlittermann:
$_ = join("", <STDIN>);
was macht dieses Zeile???
perldoc -f join
Am Samstag, dem 07. September 2002 um 14:29:53, schrieb Stefan Lagotzki:
Torsten Werner wrote:
Die Idee mit awk ist tatsächlich die eleganteste bisher, aber mit perl wird das gleiche zum übersichtlichen Vierzeiler (inklusive Kommentarbehandlung):
Mit awk brauche ich auch nur vier Zeilen :-)
Ohne Kommentarbehandlung hätte ich nur 3 Zeilen gebraucht!
Aber die Diskussion 'meins ist kürzer als deins' hatten wir schon einmal... ;-)
Torsten
Am Montag, 9. September 2002 16:06 schrieb Torsten Werner:
$_ = join("", <STDIN>);
was macht dieses Zeile???
perldoc -f join
Hmm, was join macht, weiss ich so ungefähr, es verkettet die Elemente einer Liste mir dem angegeben Trennzeichen. Ich rate jetzt mal - es wird der gesamte Inhalt von STDIN in eine Zeile geschrieben? Wasses nicht alles gibt....
Mit freundlichen Grüßen
Jens Puruckherr
On Mon, Sep 09, 2002 at 08:13:21PM +0200, Jens Puruckherr wrote:
Am Montag, 9. September 2002 16:06 schrieb Torsten Werner:
$_ = join("", <STDIN>);
was macht dieses Zeile???
perldoc -f join
Hmm, was join macht, weiss ich so ungefähr, es verkettet die Elemente einer Liste mir dem angegeben Trennzeichen. Ich rate jetzt mal - es wird der gesamte Inhalt von STDIN in eine Zeile geschrieben? Wasses nicht alles gibt....
Nicht in eine Zeile - sondern in ein Scalar. Es sind dann immer noch mehrere Zeilen. Aber eben in *einem* Wert.
Heiko
Torsten Werner wrote:
Aber die Diskussion 'meins ist kürzer als deins' hatten wir schon einmal... ;-)
Mag sein, aber ich hatte ja extra ein Smiley dahinter gesetzt :-) Perl ist ganz klar die wesentlich reichhaltigere und umfangreichere Sprache Bei awk reicht eigentlich die Kenntnis der Grundprinzipien, um so ein paar Zeilen zu schreiben. Wenn ich irgendwann mal wieder etwas Zeit habe, werde ich mich sicher mit Perl befassen, ein Buch hab ich schon.
viele Gruesse Stefan
.
Jens Puruckherr jenspuru@web.de schrieb:
Hallo,
wie mache ich aus einer dhcp.conf eine csv-Datei, in der alle
host xxxx { hardware ethernet 00:00:00:00:00:00; fixed-address 192.168.200.71; }
Einträge zeileweise abgebildet werden:
xxxx,00:00:00:00:00:00,192.168.200.71
Hi, man mag mich fuer krank halten, aber ich habe die Aufgabe (aus sportlichem Ehrgeiz) als Einzeiler fuer die bash geschrieben:
j=9;for i in `cat dhcp.conf`;do k=`expr $j / 9`;l=`expr $j % 9`;if [ $l == 1 ];then x[k]=$i;fi;if [ $l == 5 ];then y[k]=`echo $i|cut -d';' -f1`;fi;if [ $l == 7 ];then z[k]=`echo $i|cut -d';' -f1`;fi;((j++));done;for ((i=1;i<=$k;i++));do echo ${x[i]},${y[i]},${z[i]};done
dhcp.conf:
host xxxx { hardware ethernet 00:00:00:00:00:00; fixed-adress 192.168.10.1; }
host yyyy { hardware ethernet 02:00:00:00:00:00; fixed-adress 192.168.10.2; }
host zzzz { hardware ethernet 03:00:00:00:00:00; fixed-adress 192.168.10.3; }
Ausgabe:
xxxx,00:00:00:00:00:00,192.168.10.1 yyyy,02:00:00:00:00:00,192.168.10.2 zzzz,03:00:00:00:00:00,192.168.10.3
Wuenscht mir gute Besserung ;-)
Frank
Am Freitag, den 06. September 2002 um 10:51:24 Uhr (+0200) schrieb Frank Sommer:
man mag mich fuer krank halten, aber ich habe die Aufgabe (aus sportlichem Ehrgeiz) als Einzeiler fuer die bash geschrieben:
j=9;for i in `cat dhcp.conf`;do k=`expr $j / 9`;l=`expr $j % 9`;if [ $l == 1 ];then x[k]=$i;fi;if [ $l == 5 ];then y[k]=`echo $i|cut -d';' -f1`;fi;if [ $l == 7 ];then z[k]=`echo $i|cut -d';' -f1`;fi;((j++));done;for ((i=1;i<=$k;i++));do echo ${x[i]},${y[i]},${z[i]};done
sieht ja reichlich umständlich aus.
Warum macht ihr es nicht so (ist schliesslich auch ein Einzeiler):
gawk '/host/ {str1=$2} /ethernet/ {str2=$3} /fixed-adress/ {str3=$2; printf "%s,%s,%s\n", str1, gensub(/;/,"",1,str2), gensub(/;/,"",1,str3);}' dhcp.conf
Das ist dann wenigstens halbwegs lesbar.
Mir scheint aber das Wort "fixed-adress" komisch. Wird es nicht "fixed address" geschrieben?
-- Orm
hallo,
lug-dd@schlittermann.de writes:
sieht ja reichlich umständlich aus.
Warum macht ihr es nicht so (ist schliesslich auch ein Einzeiler):
gawk '/host/ {str1=$2} /ethernet/ {str2=$3} /fixed-adress/ {str3=$2; printf "%s,%s,%s\n", str1, gensub(/;/,"",1,str2), gensub(/;/,"",1,str3);}' dhcp.conf
Das ist dann wenigstens halbwegs lesbar.
Leute - ihr seit so cuuuuul :-) Danke für die vielen Anregungen, aber das Problem ist schon keins mehr. Die Daten sind in der Datenbank. Deckel zu.
Mir scheint aber das Wort "fixed-adress" komisch. Wird es nicht "fixed address" geschrieben?
so stehts in der functionierenden config drinne...ist nich von mir. soeben fiel dem Admin aber ein, dass ich hätte die Mühe mir sparen können, da er etwas ähnliches vor einiger Zeit schon mal gemacht hatte und kramte sein eigenes Scipt raus:
awk '{if ($1=="hardware") {bla=$3;getline;printf("%s\t%s\n",$2,bla)}}' /etc/dhcpd.conf | sed 's/;//g' | sort | awk '{outgoing="iptables -A check_mac -s "$1" -m mac --mac-source "$2" -j RETURN";incoming="iptables -A check_mac -d "$1" -j RETURN";system(outgoing);system(incoming)}'
Das packt zwar die Daten gleich in die iptables-rules rein, aber das hätt ich schon noch zurechgebogen. Ich resümiere: 5 Lösungen für eine Kleinigkeit, die schon lange vorbei ist.
Da fällt mir ein: Es gab doch schon öfters derart sportliche Aktivitäten. Kann man die nicht sammeln und auf der Lug-Seite in eine Best-Of - Ecke packen. Kommt echt witzig!
Mit freundlichen Grüßen
Jens Puruckherr IT/Webshop
--------------------------------------------- cyberport.de GmbH Versandhaus für Technik & Lifestyle
Am Brauhaus 5 01099 DRESDEN Fon: +49 (0)351/ 33 95 -7808 Fax: +49 (0)351/ 33 95 -799 Webseite: http://www.cyberport.de --------------------------------------------
lug-dd@mailman.schlittermann.de