Infile multiple string search

Pagina: 1
Acties:

  • toost
  • Registratie: Januari 2002
  • Laatst online: 30-01-2025
Hey,

ik heb een vrij specifieke vraag:

Ik wil binnen mijn php files zoeken op een string, via google heb ik 1000 manier gevonden en atm gebruik ik de volgende:

code:
1
find . -name "*.php" -exec grep -l "searchstring" {} \;


Dit werkt prima. Ik moet nog even benadrukken dat mijn linux kennis zo goed als 0 is.

Maar nu wil ik zoeken op meerdere strings, maar ze moeten allebei gevonden worden.

code:
1
find . -name "*.php" -exec grep -l "searchstring\|searchstring2" {} \;


Dit bovenstaande zoekt met OF string1 OF string2. De OF moet voor mij dus AND zijn. Wat ik dus zoek is het teken voor AND denk ik. Ik het het met \& geprobeerd maar dat was hem niet.

Mocht het gene wat ik wil niet op deze manier mogenlijk zijn laat dit dan aub even weten :)

This space for rent. Serious inquiries only please.


  • Kees
  • Registratie: Juni 1999
  • Laatst online: 27-01 18:27

Kees

Serveradmin / BOFH / DoC
Grep heeft inderdaad geen 'and' voor zover ik weer. Wat je zou kunnen doen, als de volgorde elke keer hetzelfde is, is 'grep -l "string1.*string2" gebruiken, dan zoek je dus op files waar "string1 blablabla string2 blabla" voorkomt (maar dus niet waar "string2 blabla string1" in voorkomt).

Als dat niet is wat je wil zou je ook een klein bashscriptje kunnen aanmaken om dat voor jou te doen:
$ cat greptest.sh
#!/bin/bash
if grep $1 $3 | grep $2 2>&1 >/dev/null
then
echo $3
fi

$ find . -name "*.php" -exec ./greptest.sh str1 str2 {} \;


Dat script kun je zelfs nog uitbreiden als je bijvoorbeeld wil zoeken naar welke files str1 en str2 hebben (maar niet perse op dezelfde regel). Dan gebruik je:
if grep $1 $3 && grep $2 $3 2>&1 >/dev/null

[ Voor 16% gewijzigd door Kees op 01-10-2009 15:45 ]

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Verwijderd

Grep heeft inderdaad geen AND. Dit is een vraag die heel veel voorkomt in de Linux/Unix wereld met tal van oplossingen. Google maar een op: grep logical AND. Er staat vast een oplossing voor je bij :)

  • toost
  • Registratie: Januari 2002
  • Laatst online: 30-01-2025
Bij mij is inderdaad het geval dat string 2 altijd na string 1 komt, dus dit voldoet prima!

Bedankt voor de hulp!

This space for rent. Serious inquiries only please.


Verwijderd

waarom gebruik je niet gewoon twee keer grep i.e.: find . -name '*.c' -exec grep blaaaaa {} | grep nogmeerblaa

edit:

Kees, wat denk je dat er gebeurd als je dat script op een hele berg files loslaat? Dat script is imo een erg slecht voorbeeld.

[ Voor 40% gewijzigd door Verwijderd op 01-10-2009 21:10 ]


  • sam.vimes
  • Registratie: Januari 2007
  • Laatst online: 07-01 22:10
toost schreef op donderdag 01 oktober 2009 @ 12:40:
[...]
Dit werkt prima. Ik moet nog even benadrukken dat mijn linux kennis zo goed als 0 is.
Als je niet weet wat een commando kan, zou je altijd moet beginnen met
man commando

In jou geval dus
man grep
Maar nu wil ik zoeken op meerdere strings, maar ze moeten allebei gevonden worden.
[...]
Het maakte hier nog niet duidelijk of de strings beide in dezelfde regel moeten staan of in dezelfde file. In een later post gaf je aan dat ze in dezelfde regel moeten staan en zelfs in de gegeven volgorde.
Dan is inderdaad
grep 'string1.*string2' files
de snelste zoekopdracht.
Als de volgorde er niet toe doet, heb je twee zoekpatronen, die je met meerdere opties '-e' aan grep kunt opgeven:
grep -e 'string1.*string2' -e 'string2.*string1' files

Je kunt de hele riedel met 'find' weglaten door de optie -R (recursive) van grep te gebruiken:
grep -R 'string1.*string2' .

zoekt in alle files onder de current directory; met de optie --include='*.php' kun je aangeven dat je alleen in php-files wilt zoeken:
grep -R --include='*.php' 'string1.*string2' .

[ Voor 1% gewijzigd door sam.vimes op 03-10-2009 18:06 . Reden: optievolgorde gecorrigeerd ]

Pagina: 1