Dette spørsmålet har allerede svar her :
Kommentarer
Svar
GNU grep
Bør være litt raskere fordi den andre grep
kan fungere på en liste over filer.
grep -lZ "foo" * | xargs -0 grep -l "321"
POSIX grep med finne
find
er mer nyttig hvis du vil søke i rekursive kataloger (i så fall miste -mindepth
og -maxdepth
alternativer.
find . -mindepth 1 -maxdepth 1 -type f -exec grep -q "foo" {} \; -exec grep -l "321" {} +
Kommentarer
Svar
Du kan gjøre dette med et kort skript:
for FILE in * do grep -q foo $FILE && grep -q 321 $FILE && echo $FILE done
Du kan også gjøre dette på en linje:
for FILE in *; do grep -q foo $FILE && grep -q 321 $FILE && echo $FILE; done
grep
returnerer 0 (true) hvis den fant strengen og &&
som skiller kommandoene, betyr at den andre vil bare løpe hvis den første var sant. -q
alternativet sørger for at grep
ikke gir noe.
Ekkoet vil bare kjøre hvis begge strengene var funnet i samme fil.
Jeg tenkte på en annen måte å gjøre det på. Denne måten vil trolig være mer effektiv hvis filene det er snakk om er større enn det installerte RAM-kortet ditt, da det bare må grep
gjennom hver fil en gang.
for FILE in * do test $(egrep -o "foo|321" $FILE | uniq | sort | uniq | wc -l) -eq 2 && echo $FILE done
og en-linjeversjonen:
for FILE in *; do test $(egrep -o "foo|321" $FILE | uniq | sort | uniq | wc -l) -eq 2 && echo $FILE; done
Kommentarer
Svar
Merkelig. For meg fungerer begge variantene (grep (GNU grep) 2.13):
grep "foo\|321" grep -E "foo|321"
Rediger 1 – bare viser filer med begge treff
for file in *
svaret fungerer, men kan bli et ytelsesmareritt (for store mengder filer ): minst to prosesser per fil. Dette er raskere (i GNU-verdenen):
find . -type f -print0 | xargs -0 -r grep --files-with-matches --null -- string1 | xargs -0 -r grep --files-with-matches -- string2
streng1 skal være den som resulterer i færre treff.
Kommentarer
Svar
I utgangspunktet for å finne alle filer inkludert en bestemt streng i en katalog, kan du bruke:
grep -lir "pattern" /path/to/the/dir
-
-l
: for å gjøre denne skanningen stopper ved første kamp
-
-i
: for å ignorere saksforskjeller i både mønsteret og inndatafilene
-
-r
: søk alle filer under katalogen, rekursivt
For å søke etter to mønstre, prøv dette:
grep -lr "321" $(grep -lr "foo" /path/to/the/dir)
Kommentarer
Svar
Bør være
grep -e "foo" -e "321" *
Bruk -e for flere mønstre
EDIT
Hvis du trenger begge for å matche:
grep -e ".*foo.*321.*" *
Hvis bestillingen ikke betyr noe:
grep -e ".*foo.*321.*" ".*321.*foo.*" *
Kommentarer