Bash string manipulation

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 :smile:

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 :smile:

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 also

0011: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

1 Like

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

1 Like