linux - texto - grep varias palabras




grep, pero solo ciertas extensiones de archivo (8)

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.

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?


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