[gelöst] exakten regexp aus txt auslesen?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
debnuxer
Beiträge: 236
Registriert: 10.03.2012 12:12:21

[gelöst] exakten regexp aus txt auslesen?

Beitrag von debnuxer » 15.09.2013 13:46:35

Da ist eine Liste (Textdatei) mit tausenden Domains.

Jede einzelne Domain belegt eine eigene Zeile.

Nun möchte ich nur Domains ausgeben, die mit www. beginnen.

Z.B. http://www.example.com, http://www.pla.example.com, usw.

Aber NICHT: www2.exapmle.com, www2.pla.example.com usw.

EDIT: AUCH NICHT SOWAS WIE m.www.linksynergy.com .

Was bisher schon mal nicht funktioniert hat:

grep ^www.
sed -n '/www./p'
sed '/www./!d'
awk '/^www./'
Zuletzt geändert von debnuxer am 16.09.2013 21:23:33, insgesamt 5-mal geändert.
Das Leben ist wie ein überdimensionales Schachbrett.

uname
Beiträge: 12403
Registriert: 03.06.2008 09:33:02

Re: exakten regexp aus txt auslesen?

Beitrag von uname » 15.09.2013 15:00:44

Der Punkt ist bei regulären Ausdrucken ein beliebiges Zeichen. Du musst ihn escapen als \.

debnuxer
Beiträge: 236
Registriert: 10.03.2012 12:12:21

Re: exakten regexp aus txt auslesen?

Beitrag von debnuxer » 15.09.2013 15:14:20

Ah, doch wieder was übersehen, vielen Dank.
Das Leben ist wie ein überdimensionales Schachbrett.

Benutzeravatar
KBDCALLS
Moderator
Beiträge: 22443
Registriert: 24.12.2003 21:26:55
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Re: [gelöst] exakten regexp aus txt auslesen?

Beitrag von KBDCALLS » 15.09.2013 15:20:15

Mit fgrep sollte es funktionieren.

Code: Alles auswählen

fgrep www\.

Code: Alles auswählen

matthias@svetlana:~/test$ cat test.txt |grep www.
http://www.eins.de
http://www2.zwei.de
http://www3.de

matthias@svetlana:~/test$ cat test.txt |fgrep www\.
http://www.eins.de
matthias@svetlana:~/test$
Mit fgrep gehts auch ohne Backslash

Code: Alles auswählen

matthias@svetlana:~/test$ cat test.txt |fgrep www.
http://www.eins.de
Was haben Windows und ein Uboot gemeinsam?
Kaum macht man ein Fenster auf, gehen die Probleme los.

EDV ist die Abkürzung für: Ende der Vernunft

Bevor du einen Beitrag postest:
  • Kennst du unsere Verhaltensregeln
  • Lange Codezeilen/Logs gehören nach NoPaste, in Deinen Beitrag dann der passende Link dazu.

debnuxer
Beiträge: 236
Registriert: 10.03.2012 12:12:21

Re: [gelöst] exakten regexp aus txt auslesen?

Beitrag von debnuxer » 15.09.2013 15:33:39

Danke.

Aber jetzt gibts noch ein Problem, wegen z.B. m.www.linksynergy.com .

fgrep ^www\. klappt nicht.
Das Leben ist wie ein überdimensionales Schachbrett.

Benutzeravatar
KBDCALLS
Moderator
Beiträge: 22443
Registriert: 24.12.2003 21:26:55
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Re: [gelöst] exakten regexp aus txt auslesen?

Beitrag von KBDCALLS » 15.09.2013 15:35:52

Bittesehr

Code: Alles auswählen

matthias@svetlana:~/test$ cat test.txt |fgrep www.
http://www.eins.de
m.www.linksynergy.com
matthias@svetlana:~/test$  
PS:

Code: Alles auswählen

fgrep
ist das gleiche wie

Code: Alles auswählen

grep -f
In beiden Fällen wird nach einem exakten String gesucht.
debnuxer hat geschrieben:Danke.

Aber jetzt gibts noch ein Problem, wegen z.B. m.www.linksynergy.com .

fgrep ^www\. klappt nicht.
Das kann ja auch nicht funktionieren. Das www steht ja auch nicht am Anfang der Zeile.
Was haben Windows und ein Uboot gemeinsam?
Kaum macht man ein Fenster auf, gehen die Probleme los.

EDV ist die Abkürzung für: Ende der Vernunft

Bevor du einen Beitrag postest:
  • Kennst du unsere Verhaltensregeln
  • Lange Codezeilen/Logs gehören nach NoPaste, in Deinen Beitrag dann der passende Link dazu.

debnuxer
Beiträge: 236
Registriert: 10.03.2012 12:12:21

Re: [gelöst] exakten regexp aus txt auslesen?

Beitrag von debnuxer » 15.09.2013 15:54:30

Ich meinte das es mit ^ bei fgrep überhaupt nicht funktioniert, es wird dann garnichts ausgegeben.

Und komischerweise funktioniert grep -f bei mir nicht, nur fgrep. Obwohl -f in der Manpage aufgeführt ist.

EDIT:
Habs jetzt einfach so gelöst:

Code: Alles auswählen

grep -F www\. | grep ^www.
THX
Zuletzt geändert von debnuxer am 15.09.2013 17:27:15, insgesamt 1-mal geändert.
Das Leben ist wie ein überdimensionales Schachbrett.

Benutzeravatar
KBDCALLS
Moderator
Beiträge: 22443
Registriert: 24.12.2003 21:26:55
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Re: [gelöst] exakten regexp aus txt auslesen?

Beitrag von KBDCALLS » 15.09.2013 16:04:58

Sorry das muß ein -F sein. -f ist eine Datei
Was haben Windows und ein Uboot gemeinsam?
Kaum macht man ein Fenster auf, gehen die Probleme los.

EDV ist die Abkürzung für: Ende der Vernunft

Bevor du einen Beitrag postest:
  • Kennst du unsere Verhaltensregeln
  • Lange Codezeilen/Logs gehören nach NoPaste, in Deinen Beitrag dann der passende Link dazu.

uname
Beiträge: 12403
Registriert: 03.06.2008 09:33:02

Re: [gelöst] exakten regexp aus txt auslesen?

Beitrag von uname » 15.09.2013 17:18:13

Ohne Parameter nutzt "fgrep" keine regulären Ausdrücke. Daher nur "www." und auch kein Dach (^). "grep" nutzt dagegen reguläre Ausdrücke, somit z.B. "^www\.". Generell würde ich wenn www am Anfang stehen soll einen regulären Ausdruck bevorzugen. Daher in diesem Fall die Syntax mit "grep" und nicht mit "fgrep".

Benutzeravatar
KBDCALLS
Moderator
Beiträge: 22443
Registriert: 24.12.2003 21:26:55
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Re: [gelöst] exakten regexp aus txt auslesen?

Beitrag von KBDCALLS » 15.09.2013 18:02:36

Wenn man schon reguläre Ausdrücke haben will/muß dann gleich egrep

Wenn man übrigens das Dach davorsetzt wird bei fgrep garnichts gefunden. Selbst dann nicht wenn das www als erstes steht.
Was haben Windows und ein Uboot gemeinsam?
Kaum macht man ein Fenster auf, gehen die Probleme los.

EDV ist die Abkürzung für: Ende der Vernunft

Bevor du einen Beitrag postest:
  • Kennst du unsere Verhaltensregeln
  • Lange Codezeilen/Logs gehören nach NoPaste, in Deinen Beitrag dann der passende Link dazu.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: [gelöst] exakten regexp aus txt auslesen?

Beitrag von Cae » 15.09.2013 18:39:19

Weil hier gerade ein wenig Verwirrung aufkommt, was RegEx angeht:

fgrep bzw. grep -F hat damit gar nichts am Hut. Es sucht nach fixen Zeichenketten und interpretiert die Argumente nicht als RegEx. Entsprechend matcht \. nur auf tatsaechlich vorhandenes Backslash-Punkt und nicht auf den Punkt -- zumindest wenn man das Argument gequotet uebergeben hat. Sonst expandiert die Shell das (zu garnichts), vergleiche

Code: Alles auswählen

$ echo \t\e\s\t
test
$ echo '\t\e\s\t'
\t\e\s\t
$ 
grep bzw. grep -G sind "normale" RegEx, "basic regular expression". Es funktionieren beispielsweise ^ fuer den Zeilenanfang, . fuer ein beliebiges Zeichen und \. fuer einen Punkt. Ranges mit \{min,max\} gehen also nur escaped.

egrep bzw. grep -E sind erweiterte RegEx, "extended regular expression". Es funktionieren alle Bestandteile von den "basic" RegEx; ausserdem kann man z.B. per foo|bar eine logische oder-Verknuepfung machen. Ranges gehen mit unescaptem {min,max}.

awk verwendet den Regelsatz von egrep, sed macht ungefaehr dasselbe wie grep, laesst sich per -r aber wohl auf den egrep-Standard umstellen. Zu beachten ist, dass POSIX-konformes sed kein + (fuer "eins oder mehr") hat, da muss man \{1,\} nehmen.

Dem TE wuerde ich normales grep empfehlen (ich gehe davon aus, dass die Forensoftware das www.example.com mit http:// kaputtexpandiert hat):

Code: Alles auswählen

$ grep '^www\.'
Sieht mit den Teststrings von oben so aus:

Code: Alles auswählen

$ cat <<EOF | grep '^www\.'
> www.example.com
> www.blah.example.com
> www2.example.com
> www2.blah.example.com
> m.www.example.com
> EOF
www.example.com
www.blah.example.com
$ 
(Ich seh' gerade, den Vorschlag hatte uname oben schon gemacht.)

Die "Loesung" von oben matcht auch auf verkehrte Strings:

Code: Alles auswählen

$ echo www2.www.example.org | grep -F www\. | grep ^www.
www2.www.example.org
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

debnuxer
Beiträge: 236
Registriert: 10.03.2012 12:12:21

Re: [gelöst] exakten regexp aus txt auslesen?

Beitrag von debnuxer » 16.09.2013 17:08:03

Jetzt aber, zwar unschön aber bisher klappt es:

Code: Alles auswählen

grep -F www\. | grep "^www." | awk '!/www[1-9]./{print ""$1""}'
Das Leben ist wie ein überdimensionales Schachbrett.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: [gelöst] exakten regexp aus txt auslesen?

Beitrag von Cae » 16.09.2013 20:38:42

Ich versteh' zwar nicht ganz, wieso du nicht einfach die funktionierende und simple Loesung von oben nimmst (zweite und dritte Codebox von meinem Post).

Aber ich muss dir Recht geben, Pipes sind toll, da kann man noch viel mehr sinnlose Dinger anhaengen:

Code: Alles auswählen

grep -F www\. | grep "^www." | awk '!/www[1-9]./{print ""$1""}' | xxd \
	| dd | xxd -r | awk 1 | sed -n p | grep . | tee /dev/null \
	| /bin/cp /dev/stdin /dev/stdout | cat
...

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

debnuxer
Beiträge: 236
Registriert: 10.03.2012 12:12:21

Re: [gelöst] exakten regexp aus txt auslesen?

Beitrag von debnuxer » 16.09.2013 21:54:18

Ok, sorry hab das \ vergessen. Vielen Dank.
Das Leben ist wie ein überdimensionales Schachbrett.

Benutzeravatar
Phineas
Beiträge: 354
Registriert: 20.06.2012 20:26:19

Re: [gelöst] exakten regexp aus txt auslesen?

Beitrag von Phineas » 16.09.2013 22:36:35

Cae hat geschrieben:

Code: Alles auswählen

... | cat
geschüttelt:

Code: Alles auswählen

... | tac | tac
gerührt:

Code: Alles auswählen

... | rev | rev
schaumig geschlagen:

Code: Alles auswählen

... cat | tac | rev | cat | tac | rev
... ist aber Geschmacksache.

Antworten