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
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.
grep
? GNUgrep
? ¿Usas Linux, Solaris, los BSD?