Această întrebare are deja răspunsuri aici :
Comentarii
Răspuns
GNU grep
Ar trebui să fie puțin mai rapid, deoarece al doilea grep
poate funcționa pe o listă de fișiere.
grep -lZ "foo" * | xargs -0 grep -l "321"
POSIX grep cu find
find
este mai util dacă doriți să căutați directoare recursive (în acest caz pierdeți -mindepth
și -maxdepth
opțiuni.
find . -mindepth 1 -maxdepth 1 -type f -exec grep -q "foo" {} \; -exec grep -l "321" {} +
Comentarii
Răspundeți
Puteți face acest lucru cu un script scurt:
for FILE in * do grep -q foo $FILE && grep -q 321 $FILE && echo $FILE done
Puteți face acest lucru și pe o singură linie:
for FILE in *; do grep -q foo $FILE && grep -q 321 $FILE && echo $FILE; done
grep
returnează 0 (adevărat) dacă a găsit șirul și &&
separând comenzile înseamnă că al doilea va rula doar dacă primul a fost adevărat. Opțiunea -q
se asigură că grep
nu produce nimic.
Ecoul va rula numai dacă ambele șiruri au fost găsit în același fișier.
M-am gândit la un mod diferit de a o face. Acest mod va fi probabil mai eficient dacă fișierele în cauză sunt mai mari decât memoria RAM instalată, deoarece trebuie să grep
să treacă prin fiecare fișier o singură dată.
for FILE in * do test $(egrep -o "foo|321" $FILE | uniq | sort | uniq | wc -l) -eq 2 && echo $FILE done
și versiunea cu o singură linie:
for FILE in *; do test $(egrep -o "foo|321" $FILE | uniq | sort | uniq | wc -l) -eq 2 && echo $FILE; done
Comentarii
Răspuns
Ciudat. Pentru mine ambele variante funcționează (grep (GNU grep) 2.13):
grep "foo\|321" grep -E "foo|321"
Editați 1 – afișează fișiere numai cu ambele potriviri
Răspunsul for file in *
funcționează, dar poate deveni un coșmar de performanță (pentru cantități mari de fișiere ): cel puțin două procese pe fișier. Acest lucru este mai rapid (în lumea GNU):
find . -type f -print0 | xargs -0 -r grep --files-with-matches --null -- string1 | xargs -0 -r grep --files-with-matches -- string2
șirul 1 ar trebui să fie cel care are ca rezultat mai puține potriviri.
Comentarii
Răspuns
Practic, pentru a găsi toate fișierele, inclusiv un anumit șir într-un director, puteți utiliza:
grep -lir "pattern" /path/to/the/dir
-
-l
: pentru a efectua această scanare se va opri la prima potrivire
-
-i
: pentru a ignora distincțiile de majuscule atât în model, cât și în fișierele de intrare
-
-r
: căutați toate fișierele în director, recursiv
Pentru a căuta două modele, încercați acest lucru:
grep -lr "321" $(grep -lr "foo" /path/to/the/dir)
Comentarii
Răspuns
Ar trebui să fie
grep -e "foo" -e "321" *
Utilizați -e pentru mai multe tipare
EDIT
În cazul în care aveți nevoie de ambele potriviri:
grep -e ".*foo.*321.*" *
Dacă ordinea nu contează:
grep -e ".*foo.*321.*" ".*321.*foo.*" *
Comentarii