Script um spezielle Einträge zu entfernen!

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
cs-flasher
Beiträge: 67
Registriert: 06.10.2002 15:01:34

Script um spezielle Einträge zu entfernen!

Beitrag von cs-flasher » 11.05.2005 16:19:10

Hallo,

folgendes Problem:
Ich habe eine textfile mit dem ich eine Liste mit MAC Adressen und daneben der Port angegeben ist.

Sieht folgendermaßen aus:


....
<MAC-Adresse> INTEGER: 25
<MAC-Adresse> INTEGER: 22
<MAC-Adresse> INTEGER: 23
<MAC-Adresse> INTEGER: 26
....


Ich bräuchte nun ein Script, dass mir jede Zeile entfernt, die den Port 25 enthalt.

Ist sowas möglich?
Wenn ja, wie?

Bin für jede Hilfe dankbar!

Gruß,

Flasher

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 11.05.2005 16:29:34

Code: Alles auswählen

root:~# cat x.txt | grep -v "INTEGER: 25"
<MAC-Adresse> INTEGER: 22
<MAC-Adresse> INTEGER: 23
<MAC-Adresse> INTEGER: 26
Gruß
gms

[edit]
damit keiner lästert (useless use of cat):

Code: Alles auswählen

root:~# grep -v "INTEGER: 25" x.txt
<MAC-Adresse> INTEGER: 22
<MAC-Adresse> INTEGER: 23
<MAC-Adresse> INTEGER: 26
[/edit]

Benutzeravatar
invertigo
Beiträge: 62
Registriert: 23.02.2005 15:47:40
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von invertigo » 11.05.2005 17:56:32

Wenn man jetzt noch die Zeile ala

Code: Alles auswählen

grep -v "INTEGER: 25" test.txt > ergebnis.txt
erweitert hat man das auch alles direkt in einer neuen Datei.

Gruesse
Hendrik

cs-flasher
Beiträge: 67
Registriert: 06.10.2002 15:01:34

Beitrag von cs-flasher » 11.05.2005 19:56:40

Hallo,

Ich habe eure Vorschläge nun eingebaut:


#!/bin/bash
grep -v "INTEGER: 25" mmacadr.cut > mmacadr.wh

Beim Ausführen erhalte ich allerdings folgende Fehlermeldung:

bad interpreter: Datei oder Verzeichnis nicht gefunden

Woran liegt das? Meine Bash liegt unter "/bin/bash"


Jetzt habe ich noch ein weiteres kleines Problem:

Es sollen nicht nur Zeilen mit dem Ausdruck "INTEGER: 25" sondern auch "INTEGER 26"
entfernt werden bzw. nicht in die neue Datei übernommen werden.

Gibt es da eine Art "or-Verknüpfung"?

Danke!

Gruß,

flasher

Benutzeravatar
Snoopy
Beiträge: 4297
Registriert: 17.11.2003 18:26:56
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rh.- Pflz.

Beitrag von Snoopy » 11.05.2005 20:21:22

hi

einfach per befehl

Code: Alles auswählen

/bin/grep -v 25 mmacadr.cut | grep -v 26 > mmacadr.wh
und fertsch

die pfade zu den dateien sollten sicherlich stimmen (so wie dort ist der aktuelle pfad auch der wo die dateien stehen)
wenn nein den absoluten pfad der dateien anpassen

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 11.05.2005 20:37:47

kann es sein, daß du dein Script in einem Dos/Windows Editor erstellt hast ?

Code: Alles auswählen

grep "INTEGER: 2[56]" in.txt >out.txt

Gruß
gms

Benutzeravatar
invertigo
Beiträge: 62
Registriert: 23.02.2005 15:47:40
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von invertigo » 11.05.2005 20:43:22

Snoopy hat geschrieben:

Code: Alles auswählen

/bin/grep -v 25 mmacadr.cut | grep -v 26 > mmacadr.wh
verstehe leider den Sinn nicht :/

mach mal in deinem script ein

Code: Alles auswählen

#!/bin/bash -v
an den Anfang.


Gruesse
Hendrik

Benutzeravatar
Snoopy
Beiträge: 4297
Registriert: 17.11.2003 18:26:56
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rh.- Pflz.

Beitrag von Snoopy » 11.05.2005 20:49:12

invertigo hat geschrieben:verstehe leider den Sinn nicht
hmm was gibts da net zu verstehen ? :?

/bin/grep -v = suche invertiert
25 = nach 25
mmacadr.cut = in der datei mmacadr.cut
| = pipe das ergebnis
grep -v = suche darin invertiert
26 = nach 26
> mmacadr.wh = das ergebnis in die datei mmacadr.wh schreiben

meinst du die erste absolute angabe des grep-befehls ?
kann man auch beim 2. angeben

Code: Alles auswählen

/bin/grep -v 25 mmacadr.cut  |  /bin/grep -v 26 > mmacadr.wh
sinnvoll wenn kein environment vorhanden ist (zb aus cronjobs)

sicherlich sollte es auch nach gms lösung gehen...

Benutzeravatar
invertigo
Beiträge: 62
Registriert: 23.02.2005 15:47:40
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von invertigo » 11.05.2005 20:57:58

Ne, ich meinte eher die zwei grep intereinander, wo er doch nur die 25 "rausfiltern" wollte ;) .oO(oder habe ich jetzt etwas ueberlesen..)

Benutzeravatar
Snoopy
Beiträge: 4297
Registriert: 17.11.2003 18:26:56
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rh.- Pflz.

Beitrag von Snoopy » 11.05.2005 20:59:10

hi

ne er möchte die 25 und 26 filtern ;)
Es sollen nicht nur Zeilen mit dem Ausdruck "INTEGER: 25" sondern auch "INTEGER 26"

Benutzeravatar
invertigo
Beiträge: 62
Registriert: 23.02.2005 15:47:40
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von invertigo » 11.05.2005 21:01:48

*pfeif*
*umkuck*
war was?

...

sorry :oops:

Benutzeravatar
Snoopy
Beiträge: 4297
Registriert: 17.11.2003 18:26:56
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rh.- Pflz.

Beitrag von Snoopy » 11.05.2005 21:02:59

no prob ;)

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 11.05.2005 21:04:36

Snoopy hat geschrieben: ne er möchte die 25 und 26 filtern ;)
wobei auch dafür keine zwei grep's benötigt werden :wink:

gewöhnliche Ausdrücke "2[56]" sind auch bei grep erlaubt

Gruß
gms

Benutzeravatar
Snoopy
Beiträge: 4297
Registriert: 17.11.2003 18:26:56
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rh.- Pflz.

Beitrag von Snoopy » 11.05.2005 21:06:19

hi

jau da haste sicherlich recht :)

hab die manpage durchgesucht...aber net gleich draufgekommen...

hab ich auch nebenbei gleich wieder was gelernt :D

cs-flasher
Beiträge: 67
Registriert: 06.10.2002 15:01:34

Beitrag von cs-flasher » 11.05.2005 21:35:36

Super :D

Leider funktioniert, das mit dem #!/bin/bash immer noch nicht!
Das script wurde ursprünglich unter solaris erstellt, ich möchte es jetzt nur unter Linux fertigstellen!

Habe schon wieder die nächste dämliche Frage :roll:

Die MAC-Adresse, die zu Beginn jeder Zeile steht ist in dezimaler Form (sehr merkwürdig) angegeben. Diese muss in hexadezimaler Form konvertiert werden.

Ich habe nun schon einen passenden Befehl gefunden, wie ich Dezimalzahlen in Hexzahlen umwandeln kann

Code: Alles auswählen

PMAC=255
HEX1=$(echo "obase=16;$PMAC"|bc)
echo $HEX1
Jetzt ist mir allerdings nicht ganz klar wie ich die MAC-Adresse am besten konvertierte:

Folgendermaßen sieht eine Zeile aus:

....
0.14.127.61.78.193 : INTEGER: 2
0.96.176.39.100.104 : INTEGER: 11
0.1.230.35.107.106 : INTEGER: 11
0.1.230.34.10.13 : INTEGER: 12
0.0.239.3.191.64 : INTEGER: 25
....


Habe mir schon überlegt, eine Schleife zu bauen, dir mir die Zahlen 1 - 6 pro Zeile ausliest, in eine Variable schreibt und dann schließlich durch die Dezimalzahl ersetzt. Die 7. Zahl wird übersprungen, weil sie ja den Port darstellt. Und dann wieder die Schleife von Anfang an durchlaufen lassen!

Wäre sowas möglich?

Oder kann man das einfacher realisieren?

Danke!

Gruß,

Flasher

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 11.05.2005 22:02:05

Code: Alles auswählen

HEX=$(printf %x.%x.%x.%x.%x.%x $(echo $PMAC|tr . " "))

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 11.05.2005 22:08:18

ein perl oneliner:

Code: Alles auswählen

gms@gms1:~$ cat in.txt | perl -ne '@x=split(/\.|: +INTEGER:/); next if $x[6]==25 || $x[6]==26; printf "%02X.%02X.%02X.%02X.%02X.%02X %d\n",@x; ' >out.txt
gms@gms1:~$ cat out.txt
00.0E.7F.3D.4E.C1 2
00.60.B0.27.64.68 11
00.01.E6.23.6B.6A 11
00.01.E6.22.0A.0D 12
Gruß
gms

cs-flasher
Beiträge: 67
Registriert: 06.10.2002 15:01:34

Beitrag von cs-flasher » 12.05.2005 09:33:05

Wow!! Funktioniert jetzt alles super! Danke! :D

Gibts da irgendein Tutorial / HowTo / Buch mit dem man Perl und dieses Unix Shell Scripting lernen kann? Ich hab da dringend nachholbedarf!

Gruß,
flasher

Benutzeravatar
Stratovarius
Beiträge: 297
Registriert: 07.04.2004 13:00:55
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 53° 27' 20,31'' N 9° 57' 29,31'' E
Kontaktdaten:

Beitrag von Stratovarius » 12.05.2005 10:25:08

3x O'Reilly:

"Einführung in Perl" - ISBN: 3-89721-147-5
"Perl" - ISBN: 3-89721-144-0
"Perl Kochbuch" - ISBN: 3-89721-366-4

Nicht ganz billig, aber feine Lektüre. Ich schwöre auf O'Reilly :mrgreen:

Für die Bash ist die Linuxfibel und ein kleiner Bash-Grundkurs evtl. interessant. Scripting ist da auch ein Thema.

mfg
Stratovarius

Antworten