Necesito grep de algunos archivos para ver cuáles contienen una palabra determinada:

grep -l word * 

Luego necesito grep de esa lista de archivos para ver cuáles contienen una palabra diferente. La forma más fácil probablemente sería escribir un script, pero no sé muy bien cómo trabajar con él.

Comentarios

  • Cuál grep? GNU grep? ¿Usas Linux, Solaris, los BSD?
  • I ' m usando Linux.

Respuesta

Suponiendo que ninguno de los nombres de archivo contiene espacios en blanco, comillas simples, caracteres de comillas dobles o barra invertida (o empezar con – con GNU grep), puede hacer:

grep -l word * | xargs grep word2 

Xargs ejecutará el segundo grep sobre cada archivo del primer grep.

Con GNU grep / xargs o compatible, puede hacerlo más confiable con:

grep -lZ word ./* | xargs -r0 grep word2 

El uso de -Z hace que grep imprime los nombres de archivo delimitados por NUL para que se puedan usar con xargs -0. La opción -r para xargs evita que se ejecute la segunda grep si la primera grep no encuentra nada.

Responda

grep -l word1 $(grep -l word2 *) 

o quizás para una de las dos palabras en la misma línea:

grep -w "word1\|word2" * 

ver aquí

Responder

Si necesita buscar archivos que contengan una palabra y luego filtrar los archivos que contienen otra palabra, puede usar una secuencia de comandos como esta:

grep word * | awk -F ":" "{print $1}"|uniq | xargs grep word2 
  • grep word * – mostrará todos los archivos que contienen «palabra», el nombre del archivo será el primero en la lista.
  • awk -F ":" "{print $1}" – imprimirá solo el nombre de archivo de sus resultados
  • uniq – se asegurará de que no imprima el nombre de archivo más de una vez.
  • xargs grep word2: volverá a buscar en la lista de archivos que obtuvo.

Comentarios

  • @don_crissti Pero combinar piezas grep -l word1 * | xargs -d'\n' grep -l word2 funciona para cualquier cosa excepto para la nueva línea, que es bastante extraño que casi nadie la usa.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *