Esta pregunta ya tiene respuestas aquí :
Comentarios
Responder
GNU grep
Debería ser un poco más rápido porque el segundo grep
puede operar en una lista de archivos.
grep -lZ "foo" * | xargs -0 grep -l "321"
POSIX grep con buscar
find
es más útil si desea buscar directorios recursivos (en ese caso, pierda -mindepth
y -maxdepth
opciones.
find . -mindepth 1 -maxdepth 1 -type f -exec grep -q "foo" {} \; -exec grep -l "321" {} +
Comentarios
Respuesta
Puede hacer esto con una secuencia de comandos corta:
for FILE in * do grep -q foo $FILE && grep -q 321 $FILE && echo $FILE done
También puede hacer esto en una línea:
for FILE in *; do grep -q foo $FILE && grep -q 321 $FILE && echo $FILE; done
grep
devuelve 0 (verdadero) si encontró la cadena y &&
que separa los comandos significa que el segundo solo se ejecutará si el primero fue verdadero. La opción -q
asegura que grep
no muestre nada.
El eco solo se ejecutará si ambas cadenas fueron encontrado en el mismo archivo.
Pensé en una forma diferente de hacerlo. De esta manera probablemente será más eficiente si los archivos en cuestión son más grandes que la RAM instalada, ya que solo tiene que grep
pasar por cada archivo una vez.
for FILE in * do test $(egrep -o "foo|321" $FILE | uniq | sort | uniq | wc -l) -eq 2 && echo $FILE done
y la versión de una línea:
for FILE in *; do test $(egrep -o "foo|321" $FILE | uniq | sort | uniq | wc -l) -eq 2 && echo $FILE; done
Comentarios
Responder
Extraño. Para mí, ambas variantes funcionan (grep (GNU grep) 2.13):
grep "foo\|321" grep -E "foo|321"
Editar 1 : muestra archivos con ambas coincidencias solamente
La for file in *
funciona pero puede convertirse en una pesadilla de rendimiento (para grandes cantidades de archivos ): al menos dos procesos por archivo. Esto es más rápido (en el mundo GNU):
find . -type f -print0 | xargs -0 -r grep --files-with-matches --null -- string1 | xargs -0 -r grep --files-with-matches -- string2
string1 debería ser el que resulte en menos coincidencias.
Comentarios
Responder
Básicamente, para encontrar todos los archivos, incluido un cadena en un directorio, puede usar:
grep -lir "pattern" /path/to/the/dir
-
-l
: para realizar este escaneo se detendrá en la primera coincidencia
-
-i
: para ignorar las distinciones entre mayúsculas y minúsculas tanto en el patrón como en los archivos de entrada
-
-r
: busque todos los archivos en el directorio, de forma recursiva
Para buscar dos patrones, intente esto:
grep -lr "321" $(grep -lr "foo" /path/to/the/dir)
Comentarios
Responder
Debería ser
grep -e "foo" -e "321" *
Utilice -e para varios patrones
EDIT
En caso de que necesite que ambos coincidan:
grep -e ".*foo.*321.*" *
Si el orden no importa:
grep -e ".*foo.*321.*" ".*321.*foo.*" *
Comentarios