Toon posts:

[Linux] Greppen met wildcards

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een vraagje : Is het mogelijk om wildcards met grep te gebruiken ? Ik heb de search gebruikt, heb gegoogled en ook de manpage bestudeerd maar ik kan het niet vinden.
Dit is wat ik heb :
code:
1
 find -exec /bin/grep -l -e 'blaat' '{}' ';'

en eigenlijk zou dit moeten worden :
code:
1
find -exec /bin/grep -l -e 'blaat1' * 'blaat2' '{}' ';'

Om het iets duidelijker te maken : het gaat om een scriptje wat moet draaien in een aantal directories van een newsserver.
Van berichten die voldoen aan bepaalde criteria wil ik op de hoogte gebracht worden. De output van het bovenstaande zijn de berichtnummers, hiermee kom ik al een heel eind. Echter, de regel bestaat uit :"NNTP-Posting-host: " <dit is dus variabel> "provider.nl"
Maar hoe krijg ik dit voor elkaar ? Ik beken eerlijk dat ik niet zo veel ervaring heb met regular expressions, dus als je nog een leerzame link hebt dan hoor ik het graag.

Verwijderd

[useless use of cat]
code:
1
cat .... | grep <bla1> | grep <bla2>

[/useless use of cat]

:?

Verwijderd

Topicstarter
Op dinsdag 26 februari 2002 18:25 schreef beelzebubu het volgende:
[useless use of cat]
code:
1
cat .... | grep <bla1> | grep <bla2>

[/useless use of cat]

:?
Kan ik dat dan ook combineren met find ?

  • 0siris
  • Registratie: Augustus 2000
  • Laatst online: 17-08 02:11
Op dinsdag 26 februari 2002 18:27 schreef Sprits het volgende:
[..]
Kan ik dat dan ook combineren met find ?
jahoor, bij mijn weten kun je dat prima doen.
Bijvoorbeeld alle bestanden vinden vanaf de root met het woord bami erin EN het woord nasi:
find ./ | grep bami | grep nasi

ach...in een volgend leven lach je er om!


Verwijderd

code:
1
find [...] | grep "term1" | grep "term2"

Lijkt me....

  • hammerhead
  • Registratie: April 2000
  • Laatst online: 18:50
Wil je zoeken naar regels waar de text
<blaat> .......tekens...... <blaat2> staat?

Kun je toch met egrep doen?

egrep 'blaat*blaat2' <bestanden>

Aviation is proof that given the will, we have the capacity to achieve the impossible.
--Eddie Rickenbacker


Verwijderd

Topicstarter
Op dinsdag 26 februari 2002 18:31 schreef hammerhead het volgende:
Wil je zoeken naar regels waar de text
<blaat> .......tekens...... <blaat2> staat?

Kun je toch met egrep doen?

egrep 'blaat*blaat2' <bestanden>
Dan krijg ik :
code:
1
find -exec egrep 'NNTP-Posting-Host: *.provider.nl' '{}' ';'


en dat werkt niet ....
Ik vraag me af of ik die wildcard wel op de juiste manier noteer, maar ik kan niet vinden hoe ik het wel moet doen.

Verwijderd

Topicstarter
Op dinsdag 26 februari 2002 18:30 schreef 0siris het volgende:

[..]

jahoor, bij mijn weten kun je dat prima doen.
Bijvoorbeeld alle bestanden vinden vanaf de root met het woord bami erin EN het woord nasi:
find ./ | grep bami | grep nasi
Dan heb ik alleen het probleem dat het dan niet noodzakelijkerwijs op dezelfde regel staat en dat moet dus wel want anders kloppen de criteria niet meer.
Zo'n regel ziet er als volgt uit :
NNTP-Posting-Host: <hostname>.provider.nl <IP-ADRES>
Ik wil van een provider alle geposte berichten in een specifieke groep filteren, om ze vervolgens te kunnen filteren op andere criteria (reacties etc. verwijderen).
Aangezien hostname variabel is (dynamisch IP-adressen) moet dat deel door grep genegeerd worden met een wildcard.

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 16-08 16:08

deadinspace

The what goes where now?

Op dinsdag 26 februari 2002 18:39 schreef Sprits het volgende:
Dan krijg ik :
code:
1
find -exec egrep 'NNTP-Posting-Host: *.provider.nl' '{}' ';'

en dat werkt niet ....
Ik vraag me af of ik die wildcard wel op de juiste manier noteer, maar ik kan niet vinden hoe ik het wel moet doen.
Vervang 'NNTP-Posting-Host: *.provider.nl' eens door 'NNTP-Posting-Host:.*.\.provider\.nl' .
Een punt betekent in regexps 'willekeurig teken', dus die moet je escapen met een \ (of het is iig netjes). Deze string werkt niet als je gewoon * (willekeurige tekenreeks) gebruikt, maar wel als je .*. (willekeurig teken, willekeurige tekenreeks, willekeurig teken), en ik weet niet waarom, maar het werkt in ieder geval wel.
Op dinsdag 26 februari 2002 18:43 schreef Sprits het volgende:
Dan heb ik alleen het probleem dat het dan niet noodzakelijkerwijs op dezelfde regel staat en dat moet dus wel want anders kloppen de criteria niet meer.
Nee hoor, die dubbele grep zou ook gewoon moeten werken. De eerste laat alleen alle regels met 'nasi' erin door, en de tweede laat uit die subset weer alle regels met 'bami' erin door. Resultaat is een lijst regels die allemaal zowel 'nasi' als 'bami' erin hebben.

Verwijderd

Topicstarter
Op dinsdag 26 februari 2002 19:24 schreef deadinspace het volgende:

[..]

Vervang 'NNTP-Posting-Host: *.provider.nl' eens door 'NNTP-Posting-Host:.*.\.provider\.nl' .
Een punt betekent in regexps 'willekeurig teken', dus die moet je escapen met een \ (of het is iig netjes). Deze string werkt niet als je gewoon * (willekeurige tekenreeks) gebruikt, maar wel als je .*. (willekeurig teken, willekeurige tekenreeks, willekeurig teken), en ik weet niet waarom, maar het werkt in ieder geval wel.
[..]

Nee hoor, die dubbele grep zou ook gewoon moeten werken. De eerste laat alleen alle regels met 'nasi' erin door, en de tweede laat uit die subset weer alle regels met 'bami' erin door. Resultaat is een lijst regels die allemaal zowel 'nasi' als 'bami' erin hebben.
En dat werkt wel :) Waar heb je deze wijsheid nou vandaan ? Ik loop steeds tegen het probleem aan dat je op een gegeven moment niet om regexps heen kan, maar ik weet waar ik erover kan leren. Met de man-page van grep kom ik er niet uit.

Verwijderd

Op dinsdag 26 februari 2002 19:24 schreef deadinspace het volgende:

[..]
Deze string werkt niet als je gewoon * (willekeurige tekenreeks) gebruikt, maar wel als je .*. (willekeurig teken, willekeurige tekenreeks, willekeurig teken), en ik weet niet waarom, maar het werkt in ieder geval wel.
[..]
Het sterretje betekent nul of meer keren het voorgaande teken, waarbij een punt voor elk teken staat. In zijn commando staat een spatie voor de *, dus dat wordt geinterpreteerd als nul of meer spaties.

edit: typo

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 16-08 16:08

deadinspace

The what goes where now?

Op dinsdag 26 februari 2002 19:51 schreef Offspring het volgende:
Het sterretje betekent nul of meer keren het voorgaande teken, waarbij een punt voor elk teken staat. In zijn commando staat een spatie voor de *, dus dat wordt geinterpreteerd als nul of meer spaties.
Oh, dat wasset...
Ik ging er eigenlijk maar van uit dat * voor 'willekeurige tekenreeks' stond. Dat . willekeurig teken is heb ik overigens van de lokale perl/regexp guru.
En heel veel meer weet ik niet van regexps (behalve dat ze gaaf zijn) :)

Sprits: je kunt dus nu overigens de .*. in mijn regexp vervangen door .*

Verwijderd

Topicstarter
Op dinsdag 26 februari 2002 20:18 schreef deadinspace het volgende:

Sprits: je kunt dus nu overigens de .*. in mijn regexp vervangen door .*
Done, 't werkt overigens ook met de extra punt.
Ga je me nou nog vertellen waar je die wijsheid vandaan hebt gehaald ;) ?

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 16-08 16:08

deadinspace

The what goes where now?

Op dinsdag 26 februari 2002 20:37 schreef Sprits het volgende:
Ga je me nou nog vertellen waar je die wijsheid vandaan hebt gehaald ;) ?
Hebbik al verteld: . is willekeurig char heb ik van de lokale perl/regexp guru (^ is overigens begin van de regel), en * heb ik hier dus opgepikt en dat was het wel zo ongeveer :)

Verwijderd

Op dinsdag 26 februari 2002 20:37 schreef Sprits het volgende:

[..]

Done, 't werkt overigens ook met de extra punt.
Ga je me nou nog vertellen waar je die wijsheid vandaan hebt gehaald ;) ?
De exacte werking van reguliere expressies hangt natuurlijk af van de tool die je gebruikt, jij gebruikte bijvoorbeeld egrep, die uitgebreidere (de e is van extended) expressies accepteert dan gewoon grep. expr gebruikt een nog beperktere set. En Perl regular expressions bieden juist nog weer meer mogelijkheden dan bijvoorbeeld egrep.

Met google is een hoop te vinden, kijk bv eens hier:

http://www.oreilly.com/catalog/regex/chapter/ch04.html

  • odysseus
  • Registratie: Augustus 2000
  • Laatst online: 23:41

odysseus

Debian GNU/Linux Sid

En als je je echt in regexps wilt verdiepen dan zijn er hele boeken voor beschikbaar...het boek van O'Reilly (Mastering Regular Expressions of iets dergelijks) staat goed bekend.

* odysseus waarschuwt alvast dat die dingen best lastig kunnen worden...alleen de klank al van termen als 'negatieve achterwaartse assertie met nulresultaat' >:) .

Leven is het meervoud van lef | In order to make an apple pie from scratch, you must first create the universe.

Pagina: 1