• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

IP-Adressen aus Textdateien filtern

fritzle

Newbie
hi zusammen.

ich versuche gerade, aus einer textdatei alle ip-adressen rauszufiltern, die ich danach weiterbearbeiten will.

ich habs bisher mit sed versucht: sed -n '/[0-9]\+\.[0-9]\+\.[0-9\+\.[0-9]/p' a.txt >b.txt

soweit so gut, das hat den umfang der datei deutlich reduziert.
problem: ich hab die zeilen, in denen eine ip-adresse vorkommt. ich wollte aber eigentlich nur die ip-adresse selbst.
wie krieg ich das denn hin?

danke.
 

gameboy

Hacker
Hallo fritzle,

ich würde das ganze mit grep machen, z.B. so:

Code:
grep -Eo [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+ a.txt >b.txt
Viele Grüße,
gameboy.
 

regexer

Advanced Hacker
oder mit perl:
Code:
perl -ne 'while (/([0-9]+\.){3}[0-9]+/g) {print "$&\n"};' a.txt
Vorteil: Funktioniert auch, wenn mehr als nur eine IP pro Zeile vorkommt...
 

gameboy

Hacker
Hallo notoxp,

notoxp schrieb:
Vorteil: Funktioniert auch, wenn mehr als nur eine IP pro Zeile vorkommt...
möchtest Du damit andeuten, daß obiger grep-Aufruf bei mehreren IPs pro Zeile nicht funktioniert? (Wenn ja, dann probier es doch mal aus...)

Viele Grüße,
gameboy.
 

regexer

Advanced Hacker
gameboy schrieb:
möchtest Du damit andeuten, daß obiger grep-Aufruf bei mehreren IPs pro Zeile nicht funktioniert? (Wenn ja, dann probier es doch mal aus...)
Stimmt! Funktioniert! Der grep hat ja viel dazugelernt, im laufe der letzten Jahre. Einiges habe ich wohl nicht mitgekriegt. Ich dachte immer grep wertet nur den ersten match einer Zeile aus. :oops:

So verbleibe als Vorteil von Perl, dass man in der Ausgabe-Formattierung mehr Möglichkeiten hätte... :wink:
 
Hallo Zusammen

Ist nicht awk das Mittel der Wahl?

Zumindest bekommt man den Eindruck wenn man "Schell-Skript Programmierung" von Patrick Ditchen wenigstens zur Hälfte gelesen hat.

Ich finde nur leider gerade die entsprechenden Stellen im Buch nicht.

Gruß Peter
 
OP
F

fritzle

Newbie
wow, das ging ja schnell.

also mit grep hab ich in der ergebnisdatei alle möglichen zahlen, mit und ohne punkte, die in der ursprungsdatei vorkommen, z.B.

3595372744707161452
3595372744707161452
9,02/12,51
45,50/16,92


das perl skript funktioniert (abgesehen davon, daß in der datei auch versionsnummern im gleichen format vorkommen, aber das ist erstmal egal).
da ich die ips aber nicht nur sehen, sondern auch noch kurz anpingen will, hab ich mal versucht, die in eine datei zu speichern, damit ich sie später weiterbenutzen kann (ja, geht vielleicht auch über pipes, aber jetzt mal eines nach dem anderen...)
also hab ich veruscht, beim print direkt in eine datei zu schreiben (vorher open und so), aber das mag er irgendwie nicht.
open(handler,datei) hab ich benutzt, aber bekomme warnungen und fehlermeldungen in der zeile des obigen skripts, anscheinend gibts da nen unterschied zwischen verwendung einer while-schleife innerhalb eines längeren skriptes und nem direkten aufruf (ja, perl -ne und die ' hab ich weggelassen und #!usr/bin/perl hab ich auch benutzt).

ich hab da jetzt dran rumgedocktert und könnte für 20 versuche ungefähr 10 fehlermeldungen posten...

irgendwie komm ich nicht weiter und steh auf dem schlauch. könnte auch daran liegen, daß da gerade so ein blöder rosenmonntagszug mit riesem lärm an meinem fenster vorbeizieht...

ich nehme an, ich muss die datei öffnen, in eine variable lesen, das raussortieren was ich will (die obige zeile), und dann die variable wieder in eine datei schreiben, oder?

danke nochmal...
 
Hallo

Ich habe die Datei die du bearbeiten musst natürlich nicht vor mir. Das macht es mir natürlich umso schwieriger. Aber ich habe gerade in meinem Buch gesucht und bin zu folgenden Vorschlag gelangt.

Probiere mal:

awk '{print $1 $2 $3 $3 $4 $5 $6}' DEINEDATEI.txt

Die Stellen bzw Variablen die du nicht brauchst nimmst einfach weg.

Das war mal so ins blaue hinein.
Ich kann am besten basteln , wenn ich die Sachen kongrett vor mir habe.

Gruß Peter
 

regexer

Advanced Hacker
fritzle schrieb:
also mit grep hab ich in der ergebnisdatei alle möglichen zahlen, mit und ohne punkte,
Man sollte auch das pattern in einfache Hochkommas setzen. Außerdem kann offensichtlich auch grep mit multiplikator arbeiten. Also etwa so:
Code:
grep -Eo '([0-9]+\.){3}[0-9]+' a.txt >b.txt

also hab ich veruscht, beim print direkt in eine datei zu schreiben
Man kann es so machen:
Code:
perl -ne 'while (/([0-9]+\.){3}[0-9]+/g) {print "$&\n"};' a.txt > b.txt

anscheinend gibts da nen unterschied zwischen verwendung einer while-schleife innerhalb eines längeren skriptes und nem direkten aufruf (ja, perl -ne und die ' hab ich weggelassen und #!usr/bin/perl hab ich auch benutzt).
Eigentlich gibt es keinen unterschied. Allerdings muss man wissen, dass der perl-Parameter -n eine while-Schleife beinhaltet.

Deswegen würde ein vollständiges und eigenständiges Script etwa so aussehen:
Code:
open (OUT, ">b.txt") || die "$!\n";
while (<>) { # Standardeingabe
  while (/([0-9]+\.){3}[0-9]+/g) {
    print OUT "$&\n";
  }
}
close OUT;
 
OP
F

fritzle

Newbie
dankeschön an alle!

ich hab jetzt mit

Code:
grep -Eo '([0-9]+\.){3}[0-9]+' a.txt | sed '/0.4.*/d' | sort | uniq > d.txt

die ips rausgefiltert, die versionsummer (im format 0.4.16.x) rausgeschmissen und doppelte einträge entfernt. funktionert, juhu!!!

dann hab ich noch ein perl-skript gefunden und ein bischen angepasst, daß die ip-adressen anpingt und die antwortenden in eine datei schreibt.

jetzt muss ich nur noch die ip-adressen, die geantwortet haben, mit der ID, die in der quelldatei dabei stand, verbinden. aber ich hoffe, daß ich das alleine schaffe, einen plan hab ich schon, nur ob perl so will wie ich weiß ich noch nicht...

danke nochmal!
 
Hallo fritzle

Bist du Administrator oder so ähnlich?

Warum befasst du dich dann nicht mit dem Buch?
http://www.buch24.de/1202250865-104314498/shopdirekt.cgi?id=3688342&p=3&t=&h=&kid=0&klid=2&sid=1

Damit habe ich meine Fortschritte gemacht. Nur den letzten Teil habe ich noch nicht gelesen, weil sich das Buch zum Schluss raus immer mehr an die Admins wendet.

Aber das ist doch genau das was du brauchst. Oder ?



:?:


Gruß Peter
 
OP
F

fritzle

Newbie
ne, bin kein admin. ich merk mir das buch mal vor, aber wahrscheinlich brauch ich in ein paar monaten sowas nicht mehr, und für das bischen ist mir so ein buch dann doch zu teuer, da behelf ich mir lieber mit tutorials im internet und kauf mir ein anderes buch.
 
Hallo

Ich wollte ursprünglich auch nicht extra haufen Geld ausgeben für ein Nebenbei-Hobby das ich ja nur selten brauche.
Dachte mir, hier und da und dort ein Tipp reicht auch. Aber denkste.
Wenn man funktionierende Scripte haben will muss man zuerst mal das Gesammt-Konzept begreifen.

Seit ich das Buch habe löse ich fast alle Probleme selber.
Und es macht riesig Spass.
Selten das ich noch jemand fragen muss.
Aber vielleicht bin ich auch noch nicht zu den wirklich ernsthaften Scripten vorgedrungen :)

Gruß Peter
 
OP
F

fritzle

Newbie
sorry, jetzt muss ich den thread nochmal ausgraben.

ich hab noch ein problem, bei dem ich bisher keine lösung gefunden habe.

ich habe einige dateien, die zeilenweise je eine IP-Adresse beinhalten. und jetzt möchte ich die dateien vergleichen, und alle Adressen, die in jeder datei vorkommen, rausfiltern (die will ich also haben). diff scheint ja nur die unterschiede rausfiltern zu können, und die einzige sonstige lösung, die mir einfällt, ist eine datei zeilenweise durchzugehen und für jede zeile ein grep für ne andere datei zu machen. und das scheint mir dann doch etwas overkill zu sein. gibts da ne einfachere lösung?

danke und grüße.
 

gameboy

Hacker
Hallo fritzle,

ich würde wie folgt vorgehen: Zunächst würde ich aus den beiden gegebenen Dateien die IP-Adressen extrahieren (z.B. mit grep -o). Anschließend würde ich die resultierenden Dateien sortieren.

Heißen die Dateien beispielsweise "ips_1_sorted" und "ips_2_sorted" kann dann mit dem Kommando

Code:
comm -1 -2 ips_1_sorted ips_2_sorted
die Menge der Zeilen ausgegeben werden, die in beiden Dateien vorhanden ist. Näheres zum verwendeten Kommando über "man comm".

Viele Grüße,
gameboy.
 

regexer

Advanced Hacker
Eine Alternative wäre auch noch join. Das ist vor allem dann zu empfehlen, wenn man in der Nachverarbeitung mehr machen will, als nur Gemeinsame IPs herauszusuchen. Join verlangt übrigens auch sortierte Eingabedateien ...
 
OP
F

fritzle

Newbie
danke, hat super funktioniert.
manchmal fehlen mir einfach die passenden befehle, und ich hab wohl die falschen begriffe beim googlen benutzt.
 

regexer

Advanced Hacker
fritzle schrieb:
manchmal fehlen mir einfach die passenden befehle
Was zu empfehlen ist:
Code:
info coreutils
Das ist eine thematisch sortierte Aufstellung der gängigsten GNU-Utilities. Es lohnt sich, die einmal durchzuarbeiten.

Für den aktuellen Fall findest du z.B. etwas in den Absätzen 7 (="operating on sorted files") und 8 (="Operating on Fields within a line").
 
Oben