linux - texto - grep varias palabras




grep, pero solo ciertas extensiones de archivo (8)

Estoy trabajando en escribir algunos scripts para grep ciertos directorios, pero estos directorios contienen todo tipo de tipos de archivos.

Quiero grep solo .h y .cpp por ahora, pero tal vez algunos otros en el futuro.

Hasta ahora tengo:

{ grep -r -i CP_Image ~/path1/;

grep -r -i CP_Image ~/path2/;

grep -r -i CP_Image ~/path3/;

grep -r -i CP_Image ~/path4/;

grep -r -i CP_Image ~/path5/;} 

| mailx -s GREP [email protected]

¿Alguien me puede mostrar cómo agregaría ahora solo las extensiones de archivo específicas?


Algunas de estas respuestas parecían tener demasiada sintaxis, o produjeron problemas en mi servidor Debian. Esto funcionó perfectamente para mí:

Revolución de PHP: ¿Cómo copiar archivos en Linux, pero solo ciertas extensiones de archivo?

A saber:

grep -r --include=\*.txt 'searchterm' ./

... o versión insensible a mayúsculas ...

grep -r -i --include=\*.txt 'searchterm' ./
  • grep : comando

  • -r : recursivamente

  • -i : ignorar-caso

  • --include : todos los archivos de texto * .txt: (escape con \ solo en caso de que tenga un directorio con asteriscos en los nombres de archivo)

  • 'searchterm' : Qué buscar

  • ./ : Comience en el directorio actual.


Como se trata de encontrar archivos, ¡usemos find !

Usando GNU find, puede usar la opción -regex para encontrar esos archivos en el árbol de directorios cuya extensión es .h o .cpp :

find -type f -regex ".*\.\(h\|cpp\)"
#            ^^^^^^^^^^^^^^^^^^^^^^^

Entonces, es solo una cuestión de ejecutar grep en cada uno de sus resultados:

find -type f -regex ".*\.\(h\|cpp\)" -exec grep "your pattern" {} +

Si no tiene esta distribución de hallazgos, debe utilizar un enfoque como el de Amir Afghani , usando -o para concatenar las opciones ( el nombre termina con .h o con .cpp ):

find -type f \( -name '*.h' -o -name '*.cpp' \) -exec grep "your pattern" {} +
#            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Y si realmente desea usar grep , siga la sintaxis indicada para: --include :

grep "your pattern" -r --include=*.{cpp,h}
#                      ^^^^^^^^^^^^^^^^^^^

Debería escribir "-exec grep" para cada "-o -name"

find . -name '*.h' -exec grep -Hn "CP_Image" {} \; -o -name '*.cpp' -exec grep -Hn "CP_Image" {} \;

O agruparlos por ()

find . \( -name '*.h' -o -name '*.cpp' \) -exec grep -Hn "CP_Image" {} \;

Opción '-Hn' muestra el nombre del archivo y la línea.


La forma más fácil es

find . -type  f -name '*.extension' | xargs grep -i string 

Qué tal si:

find . -name '*.h' -o -name '*.cpp' -exec grep "CP_Image" {} \; -print

Solo usa el parámetro --include , como este:

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP [email protected]

Eso debería hacer lo que quieras.

Notas de sintaxis:

  • -r - buscar recursivamente
  • -i - búsqueda de mayúsculas y minúsculas
  • --include=\*.${file_extension} - busca archivos que coincidan con la extensión (es) o patrón de archivo solamente

ag (el buscador de plata) tiene una sintaxis bastante simple para esto

       -G --file-search-regex PATTERN
          Only search files whose names match PATTERN.

asi que

ag -G *.h -G *.cpp CP_Image <path>

grep -rnw "some thing to grep" --include=*.{module,inc,php,js,css,html,htm} ./




grep