Cómo grep para múltiples patrones en un archivo

Esto hará lo que quieras:
grep -iwl insert $ (grep -iwl select ~ / *)

De los siguientes tres archivos, solo se devolverá test3.txt:

test1.txt:
insertar

test2.txt:
seleccionar

test3.txt:
insertar
seleccionar

Si desea buscar también en subdirectorios, pruebe esta variación:
grep -iwl insert $ (grep -Riwl select ~ / *)

Si desea buscar una tercera palabra (la palabra “eliminar”, por ejemplo), esto lo haría:
grep -iwl delete $ (grep -iwl insert $ (grep -iwl select ~ / *))

Puede seguir anidando según sea necesario.

Es posible que no siempre desee el interruptor “w”, pero lo incluí porque el criterio de ejemplo en la pregunta especificaba que las palabras coincidían. El interruptor “w” hace que grep coincida con palabras completas, por lo que el siguiente archivo no coincidiría:
insertado
seleccionando

Este comando coincidiría con palabras parciales:
grep -il insert $ (grep -il select ~ / *)

Como mencionó el usuario, el interruptor “-e” en grep dice “el siguiente argumento es una expresión regular que buscaremos”.

Otro enfoque es utilizar alternativas en el patrón que está buscando:

grep -Ei "select|insert" ~/*

Lo anterior encontraría todas las apariciones de “seleccionar” o “insertar” en los archivos de su directorio de inicio, independientemente del caso.

El ejemplo en la pregunta pide específicamente “listar archivos”. Las otras respuestas incluyen las líneas buscadas, que no es lo que había pedido el OP. Entonces aquí va:

grep -l “prueba \ | múltiple” ~ / *

Ignorar advertencias como “grep: XXXX: es un directorio”

Puede obtener dos listas de archivos en archivos temporales, uno para archivos que contienen “insertar”, otro para “seleccionar” (ver grep -l ). Ordénelos, luego use el comando comm con la opción -12 para obtener solo líneas comunes de ellos. De esa manera puede hacer otros trucos, como archivos de lista que contienen una palabra pero no otra.

Como desea una lista de los archivos que contienen ambas palabras no necesariamente en la misma línea, deberá hacerlo en dos pasos:

egrep -l seleccione FILES_LIST | xargs egrep -l inserto

El grep en el lado izquierdo de la tubería devolverá la lista de archivos que contienen la palabra ‘seleccionar’, la pasará a la tubería y los xargs a la derecha de la tubería se encargarán de encadenar esa primera lista filtrada a la segundo grep, que luego generará la lista de archivos que cumple con el requisito de tener ambas palabras.

Si su lista de archivos es larga o desconocida más allá de un patrón o una ruta, puede encadenar el primer grep a un comando de búsqueda.

Aquí hay un ejemplo de trabajo. En los últimos tres comandos, he enumerado las salidas tanto del comando parcial como del comando totalmente encadenado para hacer evidente qué parte está haciendo qué:

↪ echo -e “foo 1 \ nfoo 2 \ nfoo 3″> archivo_1.txt
↪ archivo cat_1.txt
foo 1
foo 2
foo 3
↪ echo -e “barra 1 \ nbar 2 \ nbar 3″> archivo_2.txt
↪ cat archivo_2.txt
barra 1
barra 2
barra 3
↪ echo -e “foo 4 \ nbar 4 \ nfoo 5″> archivo_3.txt
↪ cat archivo_3.txt
foo 4
barra 4
foo 5
↪ buscar ./nombre “archivo _ ?. txt”
./file_2.txt
./file_1.txt
./file_3.txt
↪ encontrar ./nombre “archivo _ ?. txt” | xargs egrep -l foo
./file_1.txt
./file_3.txt
↪ encontrar ./nombre “archivo _ ?. txt” | xargs egrep -l foo | xargs egrep -l bar
./file_3.txt