ubuntuusers.de

regex funktioniert nicht wie sie soll

Status: Gelöst | Ubuntu-Version: Server 16.04 (Xenial Xerus)
Antworten |

cibomato

Anmeldungsdatum:
5. Februar 2017

Beiträge: Zähle...

Hallo zusammen,

ich möchte mit Hilfe von 'du -ch .' Verzeichnisse und Dateien finden, die (evtl. unnötig) viel Platz verschwenden. Das mag bestimmt auch einfacher gehen (find etc) aber mir geht es primär auch darum, meine regex-Kenntnisse zu verbessern. Der Ouput von 'du -ch . |less' sieht ja z.B. folgendermaßen aus:

1
2
3
4
5
48K     ./usr/lib/dbus-1.0
56K     ./usr/lib/update-notifier
2,4M    ./usr/lib/python3.5/lib-dynload
164K    ./usr/lib/python3.5/http/__pycache__
368K    ./usr/lib/python3.5/http

Mein Ziel ist es nun, alle Zeilen zu finden, die mit einer 2 oder 3 stelligen Zahl (Kommazahlen lassen wir mal vorerst außen vor) beginnen, gefolgt von einem M oder G. Versucht habe ich es mit folgender regex, die jedoch nicht funktioniert:

1
du -ch . |grep '^\d{2,3}[MG]\s' |less

Auch andere Quantifier für die Digits wie * oder + funktionieren nicht, auch nicht, wenn ich die geschweiften Klammern maskiere. Ich habe auch versucht, anstatt \d [0-9] zu verwenden, auch das funktioniert nicht. Ohne die Suche nach den Digit, wenn ich also nur nach M oder G, gefolgt von einem Whitespace suche, geht es:

1
du -ch . |grep '[MG]\s' |less

Habt Ihr ne Idee?

Danke und viele Grüße, Jochen

lionlizard

Avatar von lionlizard

Anmeldungsdatum:
20. September 2012

Beiträge: 6244

Wohnort: Berlin

sudo du -ch . |egrep '^[[:digit:]]{2,3}[MG]\s' |less

Dazu am besten mal man grep öffnen + lesen. Ich kenn mich nämlich auch nicht aus, bin aber darüber zu den Änderungen gelangt.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

egrep statt grep, [0-9] statt \d

1
du -ch . | egrep '^[0-9]{2,3}[MG]\s'

Ob es Flags gibt, mit denen man grep auch zum Schlucken von d überreden kann, weiß ich nicht, aber wohl die manpage.

cibomato

(Themenstarter)

Anmeldungsdatum:
5. Februar 2017

Beiträge: 6

Root war ich schon aber dass das nur mit egrep funktioniert war mir neu. Wieder was gelernt. Super, vielen Dank!

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

Mit find übrigens:

1
find -size +100M -ls

cibomato

(Themenstarter)

Anmeldungsdatum:
5. Februar 2017

Beiträge: 6

Damit wären dann beide Probleme gelöst: Platzverschwender finden und regex verbessern 😉 Danke!

lionlizard

Avatar von lionlizard

Anmeldungsdatum:
20. September 2012

Beiträge: 6244

Wohnort: Berlin

cibomato schrieb:

Root war ich schon aber dass das nur mit egrep funktioniert war mir neu. Wieder was gelernt. Super, vielen Dank!

Bei meinen Versuchen ist mir anhand einer Fehlermeldung aufgefallen, dass das "\" von \d als Verseichnistrenner interpretiert wurde.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Hi Jochen,

zuerst mal herzlich willkommen hier auf dem Forum !

cibomato schrieb:

1
du -ch . |grep '^\d{2,3}[MG]\s' |less

Du hast anscheinend nur eine Kleinigkeit vergessen, nämlich die geschweiften Klammern zu escapen. Bei mir geht es so jedenfalls:

1
du -ch .  |  grep '^[0-9,]\{2,3\}[MG]'

Anscheinend kennt grep solche Klassenkürzel wie \d nur, wenn man ihn auf Perl-Syntax setzt (Option -P):

1
du -ch .  |  grep -P '^\d{2,3}[MG]'

LG,

track

cibomato

(Themenstarter)

Anmeldungsdatum:
5. Februar 2017

Beiträge: 6

Hi track,

track schrieb:

zuerst mal herzlich willkommen hier auf dem Forum !

Danke Dir! ☺

Puh, hab bis jetzt immer nur mit dem normalen grep und ein paar wenigen Parametern gearbeitet. Nun scheint egrep = grep -E wieder was anderes zu sein (zumindest bezüglich regex) als fgrep oder pgrep. Vielleicht sollte ich mal wieder mehr man-pages lesen... 😉 Oder mich gleich auch mit awk und Co beschäftigen.

Viele Grüße, Jochen

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13223

cibomato schrieb:

Nun scheint egrep = grep -E wieder was anderes zu sein (zumindest bezüglich regex) als fgrep oder pgrep.

fgrep nutzt überhaupt keine regulären Ausdrücke.

Vielleicht sollte ich mal wieder mehr man-pages lesen... 😉

Ja, das hilft ungemein.

Oder mich gleich auch mit awk und Co beschäftigen.

Ist auch nützlich. 👍

Antworten |