Mac-Adresse aus Datei herausfiltern

G

Gayson

Jungspund
Hallo!
Ich habe eine Datei, in der Mac-Adressen und der jeweilige Hostname aufgeführt sind, also z.B.
00:AA:77:88:99:BB Host1
00:AA:77:88:99:BC Host2
00:AA:77:88:99:BD Host3
Ich brauche dafür ein Skript, was bei Eingabe eines Host mir die Mac-Adresse liefert, z.B. mac=./script.sh hostname.
Ich weiß nicht ganz, wie in der Datei Mac-Adresse und Hostname getrennt sind, ich glaube durch ein Tabulator (was gibt es noch für Möglichkeiten für einen springenden Abstand, wenn man mit dem Cursor langfährt?)
Ich hatte schon ein wenig mit sed gespielt:
sed -n '/meinHostname/p' /var/tmp/ethers #gibt mir die Zeile des Hosts aus
sed -n 's/ //g' /var/tmp/ethers #sollte alle Leerzeichen entfernen, klappt nicht, weil evtl. Tab
Z.B. sollte aber sichergestellt werden, dass, wenn ich auch wirklich der richtige Host gefunden wird, wenn ich also als Host 'ei' eingebe, soll er nicht auch den Host 'eimer' finden.
Achso, ich habe nur eine begrenzte Zahl an Tools zur Verfügung, und arbeite auf der ash-Shell.
Danke an euch!!!
 
Hallo

Willst du das interaktiv?
Ausgabe auf der shell mit Eingabe des Host:
Schnellschuss, ohne genaue Eingabeprüfung etc.
Code:
#!/bin/bash
echo Hostname eingeben:;
read HOST;
echo $HOST wird gesucht;
while read MAC H;
do
if [ "$H" = "$HOST" ];
then
echo MACADRESSE IST $MAC;
else
echo MACADRESSE not found;
fi
done <mac;
mac ist dabei deine Datei wo die Adr. und Host steht.

Gruß Wolfgang
 
Nein, das will ich so nicht. Wie ich oben geschrieben habe, soll das Skript wie folgt funktionieren:
macadresse=./script.sh hostname
Und dabei in eine Datei nachschauen, die oben genannte Struktur besitzt.
 
Dein Ansatz mit sed war doch schon ganz gut. Dir fehlte nur noch das Wissen das Tabulatoren mit '\t' ausgefiltert werden können.

Du könntest es z.B. so machen:
Code:
sed -n 's/\tHostname$//p' /var/tmp/ethers

Danach steht die entsprechende MAC-Adresse auf der Standardausgabe.

Gruß,
Philip
 
Hallo
Hier noch eine Variante für nichtinteraktive Suche.
Code:
#!/bin/bash
HOST=$1;
if [ "X$HOST" = "X" ];
then
echo "Use $0 Hostname";
exit
fi
while read MAC H
do
if [ "$H" = "$HOST" ]
then
echo MACADRESSE IST $MAC;
exit;
fi
done <mac
echo MACADRESSE not found;

Das echo kannst du dir ja anpassen.

HTH
Gruß Wolfgang
 
Hmm, nun hab ich mir auch was ausgedacht, wäre schade, wenn's umsonst war:

Code:
sed -ne "/<TAB>$host$/s/<TAB>$host$//p" /var/tmp/ethers

Dabei ist <TAB> ein Tabzeichen, eingegeben durch Ctrl+V Tab.

edit @SkydiverBS: Mein sed erkennt kein \t.

Gruss, Xanti
 
Zuletzt bearbeitet:
Code:
#!/bin/bash

HOST=$1;
grep $HOST /var/tmp/ethers | cut -c 0-17

auch eine Moeglichkeit...

aufruf: ./script.sh Host1
 
Zuletzt bearbeitet:
Hm, es klappt einfach nicht. Kann es irgendwie sein, dass mein sed kein Tab kennt? Ich habe mal ne Testdatei angelegt, in die ich 53454536554<tab>kai reingeschrieben habe.
Dann habe ich mal die Sed-Befehle von Xanti und SkydiverBS ausprobiert - es wird nichts ausgegeben. Nehme ich jedoch z.B. \t weg, dann kommt eine Ausgabe...
 
Wie gesagt, sed kennt kein \t. Zumindest mit Ctrl+V Tab funktioniert es bei mir. Wenn Du perl hast, versuch mal

Code:
perl -ne "if(/\t$host\$/){s/\t$host\$//; print}" file

Gruss, Xanti
 
Zuletzt bearbeitet:
Hallo
Welches sed benutzt du?
Um möglichst kompatibel zu sein, kannst du auch [[:blank:]] einsetzen, das matcht auf Tab als auch auf Leerzeichen.
Code:
sed -ne "/[[:blank:]]$host$/{s/[[:blank:]].*$//p;q}" /var/tmp/ethers

Das q beendet sed sofort nach Treffer. Verkürzt es bei langen eindeutigen Eingaben. ;)
@Xanti
perl kennt auch \b als Wortgrenze und \s matcht auf Tab und Space.
Damit ist dem zweideutigen (Tab oder Space), was man nicht immer sieht beizukommen.
Oder wenn perl , dann noch kürzer:
Code:
perl -anle "print \$F[0] if(/$host\$/)" /var/tmp/ethers
Da ist doch Perl im Element.
:-)
Gruß Wolfgang
 
Zuletzt bearbeitet:
...
@Xanti
perl kennt auch \b als Wortgrenze und \s matcht auf Tab und Space.
Damit ist dem zweideutigen (Tab oder Space), was man nicht immer sieht beizukommen.
Oder wenn perl , dann noch kürzer:
Code:
perl -anle "print \$F[0] if(/$host\$/)" /var/tmp/ethers
Da ist doch Perl im Element.
:-)
Gruß Wolfgang

Yep, hab einfach ohne Nachzudenken den sed-Befehl in Perl umgesetzt. Deine Lösung ist natürlich eleganter. :)

Gruss, Xanti
 
Yep, hab einfach ohne Nachzudenken den sed-Befehl in Perl umgesetzt. Deine Lösung ist natürlich eleganter. :)

Gruss, Xanti
War mir schon klar, nur wollte ich Perl nicht so im Regen stehen lassen.

:devil:

Gruß Wolfgang
PS Kennt dein sed (BSD-Version) [[:blank:]]?
 
Das mit dem Blank klappt, danke. STRG+V klappt leider nicht :(. Aber egal, ist ja jetzt gelöst.
Nur eine Frage noch: Wie krieg ich die Ausgabe in eine Variable?
Ein macadresse='sed ...' klappt nicht. Was muss ich tun?
 

Ähnliche Themen

Opensuse 11 WLAN sichtbar, jedoch keine Verbindung

Ip Adresse eines embedded Linux über CGI ändern

Mysql connect Problem

Officejet schreibt nicht auf Samba-Freigabe

Zurück
Oben