Hallo,
kennt jemand von euch einen einfachen Weg
...
13;0011.439c.8c2b;10.0.1.5;Fa0/34
...
umzuwandeln in
...
13;00:11:43:9c:8c:2b;10.0.1.5;Fa0/34
...
? Falls ja, sagt ihn mir doch bitte
Gruß,
Malte
Hallo,
kennt jemand von euch einen einfachen Weg
...
13;0011.439c.8c2b;10.0.1.5;Fa0/34
...
umzuwandeln in
...
13;00:11:43:9c:8c:2b;10.0.1.5;Fa0/34
...
? Falls ja, sagt ihn mir doch bitte
Gruß,
Malte
…
13;0011.439c.8c2b;10.0.1.5;Fa0/34
…umzuwandeln in
…
13;00:11:43:9c:8c:2b;10.0.1.5;Fa0/34
…
Hallo Malte,
vorausgesetzt, deine Zeile(n) sind immer nach dem gleichen Schema aufgebaut, sprich: 4 Felder, getrennt mit Semikolon, und Feld 2 soll konvertiert werden, funktioniert z. B. folgender Weg:
$ zeile="13;0011.439c.8c2b;10.0.1.5;Fa0/34" # irgendwie einlesen...
$ feld2=$(echo $zeile | cut -f2 -d';')
$ feld2neu=${feld2//./:}
$ zeileneu=${zeile/$feld2/$feld2neu}
$ echo $zeileneu
**13;0011:439c:8c2b;10.0.1.5;Fa0/34**
Ansonsten gibt es noch viele andere Möglichkeiten (mit awk, sed, perl).
hth
bernhard
Hi,
…
13;0011.439c.8c2b;10.0.1.5;Fa0/34
…umzuwandeln in
…
13;00:11:43:9c:8c:2b;10.0.1.5;Fa0/34
…vorausgesetzt, deine Zeile(n) sind immer nach dem gleichen
Schema aufgebaut, sprich: 4 Felder, getrennt mit Semikolon,
und Feld 2 soll konvertiert werden, funktioniert z. B.
folgender Weg:$ zeile=„13;0011.439c.8c2b;10.0.1.5;Fa0/34“ # irgendwie
einlesen…
$ feld2=$(echo $zeile | cut -f2 -d’;’)
$ feld2neu=${feld2//./:}
$ zeileneu=${zeile/$feld2/$feld2neu}
$ echo $zeileneu
13;0011:439c:8c2b;10.0.1.5;Fa0/34
Das Problem ist, dass hier im zweiten Feld wieder nur 4er-Tupel entstehen, ich brauche aber zwingend 2er-Tupel. Deine Lösung liefert mir also
0011:439c:8c2b
ich brauche aber
00:11:43:9c:8c:2b
Ansonsten gibt es noch viele andere Möglichkeiten (mit awk,
sed, perl).
perl fällt hier aus, und bei awk und sed kenne ich bestenfalls die untersten Basics. Wenn ich es auf der Shell so nicht hinbekomme, muss ich im Zweifel doch auf was anderes setzen (php oder vielleicht doch perl), aber eine awk/sed-Lösung wäre mir halt am liebsten.
Gruß,
Malte
Hallo,
kennt jemand von euch einen einfachen Weg
…
13;0011.439c.8c2b;10.0.1.5;Fa0/34
…umzuwandeln in
…
13;00:11:43:9c:8c:2b;10.0.1.5;Fa0/34
…? Falls ja, sagt ihn mir doch bitte
Wenn dieser kleine schmutzige Trick erlaubt
ist:
perl -i.bak -F\; -lane '$F[1]=join":",$F[1]=~/(..)\.?/g; print join";",@F' datei
macht die Zeile das für die gesamte Datei (und
erzeugt eine Sicherungskopie).
http://www.ibm.com/developerworks/linux/library/l-p101/
http://www.perlmonks.org/?displaytype=print;node_id=…
Aber in bash könnte ich das auch nicht …
Grüße
CMБ
Hallo Malte.
Das Problem ist, dass hier im zweiten Feld wieder nur
4er-Tupel entstehen, ich brauche aber zwingend 2er-Tupel.
Deine Lösung liefert mir also0011:439c:8c2b
ich brauche aber
00:11:43:9c:8c:2b
Das hier verwendet wie gewünscht die bash/sed-Bordmittel:
#!/bin/bash
zeile="13;0011.439c.8c2b;10.0.1.5;Fa0/34"
# 2. Spalte extrahieren:
feld2=$(echo $zeile | cut -f2 -d';')
# Wert dieser Spalte in MAC-Adress-Syntax umwandeln:
feld2neu=$(echo $feld2 | sed -e 's/\.//g;' | sed -e 's/\(..\)/\1:/g' | sed -e 's/:blush://;')
# Zeile neu bauen:
zeileneu=${zeile/$feld2/$feld2neu}
# ausgeben:
echo $zeileneu
Beispiel:
$ ./mac.sh
13;00:11:43:9c:8c:2b;10.0.1.5;Fa0/34
Gruß,
-Andreas
Hallo!
aber eine awk/sed-Lösung wäre
mir halt am liebsten.
~$ echo „13;0011.439c.8c2b;10.0.1.5;Fa0/34“ | sed ‚s/([^;]*;…)(…).(…)(…).(…)(.*)/\1:\2:\3:\4:\5:\6/‘
13;00:11:43:9c:8c:2b;10.0.1.5;Fa0/34
$
Vielleicht nicht elegant, aber dafür lesbar. Wobei ich davon ausgehe, dass Dein Beispiel die Format vollständig beschreibt.
Jan
[SOLVED]Re: bash string manipulation
Hi @all,
vielen Dank für den Input, damit hab ich ein paar gute Ansätze, mit denen ich herumspielen kann.
Sinn des Ganzen ist übrigens, mir die Belegung eines LANs zu liefern (Welcher User mit welcher IP und welcher MAC-Adresse ist auf welchem Switch an welchem Port in welchem VLAN). Da ich dazu auf mehrere Datenquellen zurückgreifen muss, suche ich mir die einzelnen Infos zusammen und merge sie dann in einer CSV-Datei, die ich dann weiterverarbeiten kann.
Das Ganze könnte man auch noch auf anderen Wegen verwirklichen (SNMP-Abfragen, Datenbank etc.), aber das wäre eine zu große Kanone (wer schonmal mit SNMP auf verschiedenen Catalyst-Modellen rumgespielt hat, weiß wovon ich rede…).
Dieses isolierte Problem ist die Lösung für Ciscos bescheuerte Darstellungsformat von MAC-Adressen.
Gruß,
Malte
Hallo nochmal!
Bei den vielen Klammern lohnte sich die Suche nach dem Schalter, der die Backslashes überflüssig macht:
$ echo „13;0011.439c.8c2b;10.0.1.5;Fa0/34“ | sed -r ‚s/([^;]*;…)(…).(…)(…).(…)(.*)/\1:\2:\3:\4:\5:\6/‘
Jan