linux - varias - grep varios patrones
¿Cómo puedo buscar un patrón de líneas múltiples en un archivo? (11)
Necesitaba encontrar todos los archivos que contenían un patrón de cadena específico. La primera solución que se me viene a la mente es usar find hilo con xargs grep :
find . -iname ''*.py'' | xargs grep -e ''YOUR_PATTERN''
Pero si necesito encontrar patrones que abarquen más de una línea, estoy atascado porque la greda de vainilla no puede encontrar patrones de líneas múltiples.
¿Por qué no vas por awk ?
awk ''/Start pattern/,/End pattern/'' filename
@Marcin: awk ejemplo no codicioso:
awk ''{if ($0 ~ /Start pattern/) {triggered=1;}if (triggered) {print; if ($0 ~ /End pattern/) { exit;}}}'' filename
Aquí está el ejemplo usando GNU grep
:
grep -Pzo ''_name.*/n.*_description''
-z
/--null-data
Tratar los--null-data
entrada y salida como secuencias de líneas.
Aquí hay un ejemplo más útil:
pcregrep -Mi "<title>(.*/n){0,5}</title>" afile.html
Busca en la etiqueta del título en un archivo html, incluso si se extiende en varias líneas.
Así que descubrí pcregrep que significa Perl Compatible Regular Expressions GREP .
Por ejemplo, necesita encontrar archivos donde la variable '' _name '' es seguida inmediatamente por la variable '' _description '':
find . -iname ''*.py'' | xargs pcregrep -M ''_name.*/n.*_description''
Sugerencia: debe incluir el carácter de salto de línea en su patrón. Dependiendo de su plataforma, podría ser ''/ n'', / r '','' / r / n '', ...
Con buscador de plata :
ag ''abc.*(/n|.)*efg''
Las optimizaciones de velocidad del buscador de plata podrían brillar aquí.
Esta respuesta puede ser útil:
Regex (grep) para la búsqueda de múltiples líneas es necesario
Para buscar de forma recursiva, puede usar flags -R (recursivo) y --include (patrón GLOB). Ver:
Use grep --exclude / - incluya sintaxis para no grep a través de ciertos archivos
Puede usar grep sift sift aquí (descargo de responsabilidad: soy el autor).
Admite la coincidencia de líneas múltiples y limita la búsqueda a tipos de archivos específicos listos para usar:
sift -m --files ''*.py'' ''YOUR_PATTERN''
(buscar todos los archivos * .py para el patrón de expresión regular multilínea especificado)
Está disponible para todos los principales sistemas operativos. Eche un vistazo a la página de muestras para ver cómo se puede usar para extraer valores de líneas múltiples de un archivo XML.
Usando el editor ex
/ vi
y la opción globstar (sintaxis similar a awk
y sed
):
ex +"/string1/,/string3/p" -R -scq! file.txt
donde aaa
es su punto de partida, y bbb
es su texto final.
Para buscar recursivamente, intente:
ex +"/aaa/,/bbb/p" -scq! **/*.py
Nota: Para habilitar la sintaxis **
, ejecute shopt -s globstar
(Bash 4 o zsh).
grep -P
también usa libpcre, pero está mucho más ampliamente instalado. Para encontrar una sección de title
completa de un documento html, incluso si abarca varias líneas, puede usar esto:
grep -P ''(?s)<title>.*</title>'' example.html
Dado que pcregrep implementa según el estándar perl, use la documentación perl para referencia:
perl -ne ''print if (/begin pattern/../end pattern/)'' filename