que lista ejemplos ejecutar completa comandos comando basicos shell grep

shell - ejemplos - lista completa de comandos linux pdf



¿Cómo utilizo la opción grep--include para múltiples tipos de archivos? (6)

Cuando quiero grep todos los archivos html en algún directorio, hago lo siguiente

grep --include="*.html" pattern -R /some/path

que funciona bien El problema es cómo grep todos los archivos html, htm, php en algún directorio?

A partir de este uso grep --exclude / - incluye sintaxis para no grep a través de ciertos archivos , parece que puedo hacer lo siguiente

grep --include="*.{html,php,htm}" pattern -R /some/path

Pero lamentablemente, no funcionaría para mí.
FYI, mi versión grep es 2.5.1.


¿Esto no funciona?

grep pattern /some/path/*.{html,php,htm}


El uso de {html,php,htm} solo puede funcionar como una expansión de llaves , que es una función no estándar (que no cumple con POSIX) de bash , ksh y zsh .

  • En otras palabras: no intente usarlo en un script que se dirija a /bin/sh : utilice argumentos explícitos múltiples - --include en ese caso.

  • grep no comprende la notación {...} .

Para que se reconozca una expansión de llaves, debe ser un token sin comillas (parte de una) en la línea de comando.

Una expansión de llaves se expande a múltiples argumentos , por lo que en el caso que nos ocupa grep termina viendo múltiples opciones --include=... , como si las --include=... pasado individualmente.

Los resultados de una expansión de llaves están sujetos a globbing (expansión de nombre de archivo) , que tiene dificultades :

  • Cada argumento resultante podría expandirse a nombres de archivos coincidentes si contiene metacaracteres globbing sin comillas como * .
    Si bien esto es poco probable con tokens como --include=*.html (por ej., --include=*.html que tener un archivo literalmente llamado algo como --include=foo.html para que coincida con algo), vale la pena tenerlo en cuenta general.

  • Si la opción de nullglob shell está activada ( shopt -s nullglob ) y globbing no coincide con nada , el argumento será descartado .

Por lo tanto, para una solución completamente robusta , use lo siguiente:

grep -R ''--include=*.''{html,php,htm} pattern /some/path

  • ''--include=*.'' se trata como un literal , debido a que se cita solo ; esto evita la interpretación inadvertida de * como un personaje globbing.

  • {html,php,htm} , la necesidad de expansión de llaves sin cita [1] , se expande a 3 argumentos, que, debido a {...} directamente después del token ''...'' , incluyen ese token.

  • Por lo tanto, después de la eliminación de la cita por el shell, los siguientes 3 argumentos literales finalmente se pasan a grep :

    • --include=*.html
    • --include=*.php
    • --include=*.htm

[1] Más exactamente, solo las partes relevantes de la sintaxis de la expansión de corchete deben ser sin comillas, los elementos de la lista aún pueden ser citados individualmente y deben serlo si contienen metacaracteres globbing que podrían resultar en globbing indeseados después de la expansión del corsé; aunque no es necesario en este caso, lo anterior podría escribirse como
''--include=*.''{''html'',''php'',''htm''}


Intenta eliminar las comillas dobles

grep --include=*.{html,php,htm} pattern -R /some/path


Prueba esto. -r hará una búsqueda recursiva. -s suprimirá los errores de archivo no encontrado. -n le mostrará el número de línea del archivo donde se encuentra el patrón.

grep "pattern" <path> -r -s -n --include=*.{c,cpp,C,h}


Puede usar múltiples --include flags. Esto funciona para mí:

grep -r --include=*.html --include=*.php --include=*.htm "pattern" /some/path/

Sin embargo, puedes hacer lo que sugirió Deruijter . Esto funciona para mí:

grep -r --include=*.{html,php,htm} "pattern" /some/path/

No olvide que puede usar find y xargs para este tipo de cosas para:

find /some/path/ -name "*.htm*" -or -name "*.php" | xargs grep "pattern"

HTH


Usa grep con el comando find

find /some/path -name ''*.html'' -o -name ''*.htm'' -o -name ''*.php'' -type f -exec grep PATTERN {} /+

También puede usar las opciones de tipo -regex y -regextype .