Manual GREP Español
Manual GREP Español
Section: User Commands (1) Updated: 10 Septiembre 1992 Index Return to Main Contents
NOMBRE
grep, egrep, fgrep - muestran lneas que concuerdan con un patrn
SINOPSIS
grep [-AB] nm] [-CEFGVbchiLlnqsvwxyUu] [[-e ] patrn | -f fichero] [--extended-regexp] [--fixedstrings] [--basic-regexp] [--regexp=PATRN] [--file=FICHERO] [--ignore-case] [--word-regexp] [-line-regexp] [--line-regexp] [--no-messages] [--revert-match] [--version] [--help] [--byte-offset] [--linenumber] [--with-filename] [--no-filename] [--quiet] [--silent] [--files-without-match] [--files-withmatcces] [--count] [--before-context=NUM] [--after-context=NUM] [--context] [--binary] [--unix-byteoffsets] ficheros...
DESCRIPCIN
Grep busca en la entrada, bien en la que se le especifica con nombres de ficheros o bien en la entrada estndar si no se le dan dichos nombres o si uno de stos consiste en -, lneas que concuerden o coincidan con el patrn dado. Si no se dice otra cosa, grep muestra las lneas que concuerden. Hay tres grandes variantes de grep, controladas por las siguientes opciones: -G, --basic-regexp Interpreta patrn como una expresin regular bsica (vea ms abajo). ste es el comportamiento predeterminado. -E, --extended-regexp Interpreta patrn coma una expresin regular extendida (vea ms adelante). -F, --fixed-strings Interpreta patrn como una lista de cadenas de caracteres fijas, separadas por saltos de lnea; se busca la concordancia de una cualquiera de ellas. Adems, estn disponibles dos programas que son variantes de ste: egrep y fgrep. egrep es similar (pero no idntico) a grep -E, y es compatible con el egrep histrico de Unix. fgrep es lo mismo que grep -F. Todas las variantes de grep entienden las siguientes opciones:
-nm Las lneas concordantes se mostrarn acompaadas de nm lneas anteriores y posteriores. Sin embargo, grep nunca mostrar cualquier lnea dada ms de una vez. -A nm, --after-context=NM Muestra nm lneas de contexto despus de las que concuerden con el patrn. -B nm, --before-context=NM Muestra nm lneas de contexto antes de las que concuerden con el patrn. -C, --context Equivalente a -2. -V, --version Muestra el nmero de versin de grep en la salida estndar de errores. Este nmero de versin debera incluirse en todos los informes de fallos (vea ms abajo). -b, --byte-offset Muestra el desplazamiento en bytes desde el principio del fichero de entrada antes de cada lnea de salida. -c, --count Suprime la salida normal; en su lugar muestra el nmero de lneas que concuerdan con el patrn para cada fichero de entrada. Con la opcin -v, --revert-match (vea ms abajo), muestra el nmero de lneas que no concuerden. -e patrn,--regexp=PATRN Emplea patrn como el patrn; til para proteger patrones que comiencen con -. -f fichero,--file=FICHERO Obtiene el patrn de fichero. -h, --no-filename Suprime la impresin de los nombres de ficheros antes de las lneas concordantes en la salida, cuando se busca en varios ficheros. -i, --ignore-case No hace caso de si las letras son maysculas o minsculas ni en el patrn ni en los ficheros de entrada. -L, --files-without-match Suprime la salida normal; en su lugar muestra el nombre de cada fichero de entrada donde no se encuentre ninguna concordancia y por lo tanto de cada fichero que no producira ninguna salida. La bsqueda se detendr al llegar a la primera concordancia. -l, --files-with-matches Suprime la salida normal; en su lugar muestra el nombre de cada fichero de entrada que producira alguna salida. La bsqueda se detendr en la primera concordancia. -n, --line-number Prefija cada lnea de salida con el nmero de lnea de su fichero de entrada correspondiente. -q, --quiet Silencioso; suprime la salida normal. La bsqueda finaliza en la primera concordancia. -s, --silent Suprime los mensajes de error sobre ficheros que no existen o no se pueden leer. -v, --revert-match Invierte el sentido de la concordancia, para seleccionar las lneas donde no las hay. -w, --word-regexp
Selecciona solamente aquellas lneas que contienen concordancias que forman palabras completas. La comprobacin consiste en que la cadena de caracteres concordante debe estar al principio de la lnea o precedida por un carcter que no forme parte de una palabra. De forma similar, debe estar o al final de la lnea o ser seguida por un carcter no constituyente de palabra. Los caracteres que se consideran como parte de palabras son letras, dgitos y el subrayado. -x, --line-regexp Selecciona solamente aquellas concordancias que constan de toda la lnea. -y Sinnimo obsoleto de -i. -U, --binary Trata el(los) fichero(s) como binario(s). De forma predeterminada, bajo MS-DOS y MSWindows, grep intenta adivinar el tipo del fichero mirando los contenidos de los primeros 32 kB ledos de l. Si grep decide que el fichero es de texto, quita los caracteres CR (retorno de carro) de los contenidos originales del fichero (para que las expresiones regulares con ^ y $ funcionen correctamente). Al especificar -U deshabilitamos este intento de adivinacin del tipo del fichero, haciendo que todos se lean y pasen al mecanismo de concordancia tal cuales; si el fichero lo es de texto y tiene al final de cada lnea el par de caracteres CR/LF, esto har que algunas expresiones regulares fallen. Esta opcin slo tiene sentido en MS-DOS y MS-Windows. -u, --unix-byte-offsets Informa de desplazamientos de bytes al estilo de Unix. Esta opcin hace que grep muestre los desplazamientos de bytes como si el fichero fuera de texto al estilo de Unix; o sea, sin los caracteres CR al final de cada lnea. Esto producir resultados idnticos a ejecutar grep en un sistema Unix. Esta opcin no tiene efecto a menos que se d tambin la opcin -b; slo tiene sentido en MS-DOS y MS-Windows.
EXPRESIONES REGULARES
Una expresin regular es un patrn que describe un conjunto de cadenas de caracteres. Las expresiones regulares se construyen de forma anloga a las expresiones aritmticas, combinando expresiones ms pequeas mediante ciertos operadores para formar expresiones complejas. El programa grep entiende dos versiones diferentes de sintaxis para las expresiones regulares: la ``bsica'' y la ``extendida''. En la versin de grep de GNU, no hay diferencia en usar una u otra en cuanto a la funcionalidad disponible. En otras implementaciones, las expresiones regulares bsicas son menos potentes. La siguiente descripcin se aplica a expresiones regulares extendidas; las diferencias con las bsicas se resumen a continuacin. Los bloques de construccin fundamentales son las expresiones regulares que concuerdan con un solo carcter. La mayora de los caracteres, incluyendo todas las letras y dgitos, son expresiones regulares que concuerdan consigo mismos. Cualquier meta-carcter con un significado especial debe ser protegido precedindolo con una barra inclinada inversa. Una lista de caracteres rodeados por [ y ] concuerda con cualquier carcter de esa lista; si el primer carcter de la lista es el acento circunflejo ^ entonces concuerda con cualquier carcter de fuera de la lista. Por ejemplo, la expresin regular [0123456789] concuerda con cualquier carcter dgito. Se puede
especificar un rango de caracteres ASCII dando el primero y el ltimo, separados por un guin. Finalmente, estn predefinidas ciertas clases de caracteres, con un nombre para cada una. Estos nombres son auto-explicativos, y son [:alnum:], [:alpha:], [:cntrl:], [:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:], y [:xdigit:]. Por ejemplo, [[:alnum:]] significa (en ingls) [0-9A-Za-z], salvo que la ltima forma depende de que la codificacin de caracteres siga el estndar ISO-646 o ASCII, mientras que la primera es transportable. (Observe que los corchetes en estos nombres de clases son parte de los nombres simblicos, y deben incluirse adems de los corchetes que delimitan la lista entre corchetes.) La mayor parte de los meta-caracteres pierden su significado especial dentro de estas listas. Para incluir un ] literal, pngalo el primero de la lista. De forma similar, para incluir un ^ literal, pngalo en cualquier sitio menos el primero. Finalmente, para incluir un - literal, pngalo el ltimo. El punto . concuerda con cualquier carcter solo. El smbolo \w es un sinnimo de [[:alnum:]] y \W lo es de [^[:alnum]]. El acento circunflejo ^ y el signo del dlar (y del escudo portugus) $ son meta-caracteres que respectivamente concuerdan con la cadena vaca al comienzo y al final de una lnea. Los smbolos \< y \> respectivamente concuerdan con la cadena vaca al principio y al final de una palabra. El smbolo \b concuerda con la cadena vaca al borde de una palabra, y \B concuerda con la cadena vaca supuesto que no est en el extremo de una palabra. Una expresin regular que concuerde con un solo carcter puede ser seguida por uno de estos varios operadores de repeticin: ? El elemento precedente es opcional y concuerda como mucho una vez. * El elemento precedente concordar cero o ms veces. + El elemento precedente concordar una o ms veces. {n} El elemento precedente concuerda exactamente n veces. {n,} El elemento precedente concuerda n o ms veces. {,m} El elemento precedente es opcional y concuerda como mucho m veces. {n,m} El elemento precedente concuerda como poco n veces, pero no ms de m veces. Dos expresiones regulares pueden concatenarse; la expresin regular resultante concuerda con cualquier cadena formada mediante la concatenacin de dos subcadenas que concuerdan respectivamente con la s subexpresiones concatenadas. Dos expresiones regulares pueden juntarse mediante el operador infijo |; la expresin regular resultante concuerda con cualquier cadena que concuerde con cualquiera de las subexpresiones.
La repeticin tiene precedencia sobre la concatenacin, la cual a su vez tiene precedencia sobre la alternancia. Una subexpresin entera puede ser encerrada entre parntesis para subvertir estas reglas de precedencia. La retrorreferencia \n, donde n es un dgito simple, concuerda con la subcadena que previamente concord con la n-sima subexpresin entre parntesis de la expresin regular. En las expresiones regulares bsicas, los meta-caracteres ?, +, {, |, (, y ) pierden su significado especial; en su lugar emplee las versiones protegidas mediante la barra inversa \?, \+, \{, \|, \(, y \). En egrep, el meta-carcter { pierde su significado especial; en su lugar emplee \{.
DIAGNSTICOS
Normalmente, el status de salida es 0 si se encuentran concordancias, y 1 si no se encuentran. (La opcin -v invierte el sentido del status de salida.) El status de salida es 2 si haba errores de sintaxis en el patrn, si los ficheros de entrada eran inaccesibles, o en caso de otros errores del sistema.
FALLOS
Enve informes sobre fallos por correo electrnico a la direccin [email protected]. Asegrese de incluir la palabra ``grep'' en algn sitio del campo ``Asunto:'' (``Subject:''). Nmeros de repeticin grandes en la construccin {m,n} pueden hacer que grep emplee grandes cantidades de memoria. En adicin a esto, ciertas otras obscuras expresiones regulares requieren tiempo y espacio exponenciales, y pueden hacer que grep se quede sin memoria. Las retrorreferencias son muy lentas, y pueden requerir un tiempo exponencial.
1. Introduccin
1.1. Sobre este tutorial
Este tutorial asume cierta familiaridad con la lnea de comandos y bash, para informacin ms detallada: http://www.esdebian.org/wiki/manual-programacion-bash-shell , si bien no es necesario saber hacer scripts en bash para seguir el tutorial con normalidad ayudar a entender un poco ciertas partes que se expliquen. En las secciones del tutorial en los que se necesiten conocimientos de bash se aadirn enlaces a las partes de la wiki que contengan dicha informacin. El presente tutorial se ha hecho de tal modo que se aprenda practicando y viendo ejemplos de expresiones regulares ya hechas, por ello las explicaciones de cada metacarcter se reducen a lo imprescindible, a partir del punto 2 todos los ejemplos estn hechos de forma que pueda copiar y pegarlos en su terminal para comprobar que funcionan, hacerles modificaciones al texto o a la expresin regular y as saber si ha comprendido los conceptos.
1.2. Qu es una expresin regular?
Si le digo que una expresin regular es un metalenguaje para expresar el conjunto de palabras aceptadas por los autmatas finitos, a menos que haya estudiado teora de autmatas puede que no le diga mucho, pero si le digo que con una expresin regular puede encontrar todas las direcciones de email que hay en
un texto cualquiera de forma automtica puede que le empiece a interesar. Como definicin prctica podramos decir que una expresin regular es un buscador de patrones, esto es, para cualquier patrn que defina (recuerde el ejemplo del email) la expresin regular buscar todas las coincidencias. Como puntualizacin habra que aadir que las expresiones regulares buscarn coincidencias por lneas, esto es que la coincidencia de un patrn en el texto tiene que encontrarse en su totalidad en la misma lnea. Ej:
grep 'hola que tal' archivo
Buscar todos los 'hola que tal' (sin comillas) que aparezcan en el texto en la misma lnea, esto es: Encontrar:
hola que tal ests hoy
Pero no encontrar:
hola que tal ests hoy
1.3. grep
En este tutorial usaremos la herramienta grep, includa en cualquier instalacin de Debian. El nombre grep viene de un comando del editor de textos ed (g/re/p), cuyo significado es g: global (en todo el texto), re: regular expression (buscar la expresin regular), p:print (e imprimirla). Y eso es lo que hace justamente grep. Opciones de grep: grep tiene muchas opciones, para ms informacin consultar el manual:
man grep
En este tutorial slo veremos algunas, que son las que nos servirn para aprender a usar las expresiones regulares:
-G o --basic-regexp : Interpreta el patrn como una expresin regular bsica (las que aprenderemos
en este tutorial). Al ser este el comportamiento por defecto de grep, no se usar. -v o --invert-match : Invierte el sentido de bsqueda, es decir, busca todo lo que no coincida con el patrn dado. -o o --only-matching : Por defecto grep imprime la lnea entera de la coincidencia encontrada, con esta opcin imprimira slo la coincidencia. La entrada de texto de grep puede hacerse de dos maneras, dndole el nombre de un fichero, con lo que grep buscara coincidencias en ese fichero; o introduciendo texto por la entrada estndar (o redirigiendolo). Ejemplo:
grep 'regex' archivo
grep 'regex'
Redirigiendo la salida del comando echo para usarla como entrada de grep. Para ms informacin sobre redireccin consultar: http://www.esdebian.org/wiki/manual-programacion-bash-shell#referencia-2... Para una mejor visualizacin de las coincidencias encontradas aade, si no lo tienes ya, la siguiente lnea a tu bashrc o bash_aliases:
alias grep='grep --color=auto'
Los comandos anteriores slo hace falta introducirlos una vez, con ellos aadir color a las coincidencias de grep para la presente terminal y todas las siguientes.
1.4. Entrecomillando los patrones
Como norma general entrecomillaremos los patrones que le pasemos a grep usando comillas simples, esto es as debido a que bash realiza sustituciones en determinados carcteres que tienen significado especial para l. http://www.esdebian.org/wiki/manual-programacion-bash-shell#referencia-2... (patrones de sustitucin) http://www.esdebian.org/wiki/manual-programacion-bash-shell#referencia-2... (entrecomillado) No hay que confundir los patrones de sustitucin de bash con expresiones regulares, ya que aunque algn carcter pueda significar lo mismo las expresiones regulares y los patrones de sustitucin no son lo mismo. Y las variables? Si ha ledo los links anteriores, sobre todo el segundo puede que se est preguntando acerca de qu es lo que tiene que hacer si quiere usar el valor de una variable dentro de una expresin regular, pues es muy sencillo, encerrarla entre comillas dobles. Ejemplo: variable='hola' grep 'regex'"$variable"'regex' archivo Ya que la concatenacin de cadenas de texto en bash se hace poniendolas juntas.
2. Expresiones regulares
2.1. 'carcter'
La expresin regular ms sencilla que se puede crear es la compuesta por un carcter o por un conjunto de carcteres (palabra). Ej: grep 'hola' archivo # Busca 'hola' en archivo grep 'a' archivo # Busca 'a' en archivo grep 'bienvenido al tutorial' archivo # Busca 'bienvenido al tutorial' en archivo
En las expresiones regulares, las barras invertidas "\" normalmente quitan el significado especial de algn carcter, aunque algunas veces se lo den, esto puede ser un poco complicado al principio pero se acabar acostumbrando. Como norma general, cualquier carcter con un significado especial que vea en este tutorial estar en la forma en la que tenga el significado especial, para quitarle ese significado no tiene ms que quitarle la barra si la tiene o ponrsela si no la tiene. Normalmente a los carcteres precedidos por barra invertida y que sin ella tendran significado especial, se llaman escapados.
2.3. Punto
El carcter punto "." se sustituye en una expresin regular por cualquier carcter, excepto nueva lnea. Ejemplos:
echo 'a b' | grep -o '.'
grep slo encontrar como coincidencia: ".", ya que al escapar el patrn ha hecho que este pierda su significado de cualquier carcter, a tener el significado de: el carcter punto.
quien=tu echo 'en un'"$quien"' mi' | grep -o '..'
grep encontrar como coincidencias: ";:a", "una", "ala", pero no "uno" ya que no coincide con el patrn cualquier palabra de tres carcteres siendo el ltimo la "a" Ntese que con palabra nos referimos a cualquier concatenacin de carcteres
echo 'vuela miedo fuera' | grep -o '..e.a'
grep encontrar como coincidencias: "vuela", "fuera", pero no "miedo" ya que aunque cumple la parte del patrn "..e." no cumple lo de acabar en a.
echo 'Este tutorial de grep me gusta mucho' | grep -o '.e'
Al contrario de lo que se podra esperar no slo ha encontrado las coincidencias: "de" y "me". El resultado es cuando menos extrao, si se ha usado la opcin -o como en este ejemplo se obtendrn trozos de palabra, en concreto los trozos que concuerdan con el patrn, sin la opcin -o y con el coloreado de grep activado se observar mejor y se podrn inferir las razones. Lo que ha ocurrido ha sido porque la expresin regular buscaba patrones que coincidieran con ".e" includos los que estuviesen dentro de otras palabras, entonces cmo buscamos nicamente por las palabras que coincidan con ".e"? Una posible solucin sera aadir espacios a los dos lados del patrn:
Esto solucionara el problema con esta cadena de texto, pero y si una de las palabras que queremos encontrar con el patrn estn al principio o al final de la lnea?, en ese caso los espacios seran un problema ya que pueden faltar. La solucin est en usar otro de los meta-caracteres de las expresiones regulares: \<\>
2.4. \<\>
El metacarcter \<\> hace que todos los patrones dentro de l slo coincidan con palabras enteras, esto es, palabras separadas entre s por espacios. Para este metacarcter los smbolos de puntuacin (.,< etc...) no forman parte de la palabra.
echo 'Este tutorial de grep me gusta mucho' | grep -o '\<..\>'
grep encontrar como coincidencias: "de" y "me", ya que son las nicas palabras enteras que coinciden con el patrn.
echo 'Ya hemos aprendido algunas cosas' | grep -o '\<....s\>'
grep encontrar como coincidencia: "Ya", sin embargo si no hubiesemos puesto \<\> entonces el patrn habra coincidido tambin con: " a", "na", "sa". La coincidencia con " a" es debida a que como se explic antes, el punto es sustituido por cualquier carcter exceptuando nueva lnea.
echo '<>' | grep '<..'
grep encontrar como coincidencia: "<echo '<>' | grep '\<..' grep encontrar como coincidencias: "Ya", "he", "ap", "al", "co", esto es, el principio de cada palabra que encaje con el patrn. Por lo tanto \> har lo contrario. Veamoslo en un ejemplo.
echo '<>' | grep '..\>'
grep encontrar como coincidencias: "Ya", "os", "do", "as", "as", o lo que es lo mismo el final de las palabras que encajan con el patrn.
2.5. * (Repitiendo patrones)
Todos los metacarcteres anteriores estn muy bien si sabe exctamente cuntos carcteres tiene la palabra que quiere buscar, pero qu ocurre si no lo sabe?, pues que habr que usar el metacarcter *, * repetir el patrn que le precede cero o ms veces.
echo '4 44 444 444 4444 44444' | grep '4*'
grep encontrar como coincidencias todos y cada uno de los nmeros que contengan cuatros.
echo '4 454 4554554 455545554 4555455545554 44444' | grep '4*'
grep encontrar como coincidencias todos y cada uno de los nmeros que contengan cuatros.
echo '4 454 4554554 455545554 4555455545554 44444' | grep '.*'
grep encontrar como coincidencias todos, ya que el punto se traduce como cualquier carcter y * (repetido cero o ms veces).
grep encontrar como coincidencias: ".*" debido a que los carcteres estn escapados.
echo '4 454 4554554 455545554 4555455545554 44444' | grep '\<4*\>'
grep encontrar como coincidencias slo los nmeros que contengan nicamente cuatros. Pero hay que tener cuidado con *, ya que como dice la definicin "repetir el patrn que le precede cero o ms veces." Todava no ve el peligro?, vemoslo con un ejemplo.
echo -e "Lnea sin comentario\n#Lnea con comentario\nLnea sin comentario" | grep '#*'
echo -e interpreta "\n" como nueva lnea, es decir, sera como escribir la frase hasta "\n" darle al retorno de carro (enter, nueva lnea) continuar escribiendo y repetir lo anterior Con ste patrn debera encontrar las lneas que tengan algn comentario, o no?. Como poda esperar tras toda la preparacin anterior: no, pero lo importante es el por qu; esto ha ocurrido porque como se mencion anteriormente * repeta el patrn anterior cero o ms veces, o lo que es lo mismo, se buscaran todas las lneas tuvieran o no #. Para solucionar este problema no habra ms que aadir otro # antes del que precede al *:
echo -e "Lnea sin comentario\n#Lnea con comentario\nLnea sin comentario" | grep '##*'
esto buscar todas las lneas que tengan uno o ms # debido a que el metacarcter slo se aplica al patrn que le precede, esto es, el segundo #.
2.6. Rango de carcteres []
Gracias al metacarcter [], se pueden elegir diferentes carcteres a los cules aplicarles algn otro patrn de sustitucin.
echo '5895 589435 539853 54849' | grep -o '[0123456789]*'
grep encontrara como coincidencias a todos los conjuntos numricos, ya que es lo que le hemos indicado con el conjunto de carcteres encerrados entre corchetes.
echo 'hola hhaif aieo uuieo' | grep -o '\<[aeiou]*\>'
grep encontrara como coincidencias a todos los grupos de vocales: "aieo", "uuieo" En estos casos tambin se pueden indicar rangos, por ejemplo, para que coincida con cualquier nmero se puede poner de la siguiente manera: [0-9], ntese que se empieza en cero; para indicar cualquier letra (del abecedario ingls) minscula se puede hacer [a-z], y maysculas: [A-Z], tambin se pueden combinar: [a-zA-Z] coincidira con cualquier letra, mayscula o minscula.
echo 'hola hhaif AiEo uu66ieo' | grep -o '\<[A-Za-z]*\>'
grep encontrara como coincidencias todas las palabras que slo contengan letras alfabticas (inglesas).
grep encontrara como coincidencias todas las palabras que slo contengan letras alfabticas minsculas (cualquiera) y las letras maysculas A e I. Al utilizarse el guin para indicar rangos, si queremos usarlo como carcter en el grupo debemos ponerlo al principio o al final, y cualquier metacarcter debe ir escapado.
echo 'hola hh-AIf A-iEo u.u66ieo' | grep '[AIa-z\.-]*'
grep encontrara como coincidencias todas las palabras o subpalabras que slo contengan letras alfabticas minsculas (cualquiera) y A e I, adems de los smbolos "." y "-".
echo 'hola hh-AIf A-iEo u.u66ieo' | grep -o '\<[AIa-z\.-]*\>'
en este caso, con la idea de que coincida cualquier palabra que contenga el conjunto antes mencionado, se ha usado el metacarcter \<\>, pero el resultado no ha sido el esperado, y su explicacin es que el metacarcter anterior sirve para coincidir con palabras que no contengan smbolos de puntuacin o guiones. Cabe destacar que existen conjuntos de carcteres POSIX definidos para aadir portabilidad, son los siguientes: [:alnum:] Alfanumricos [:alpha:] Carcteres alfabticos [:upper:] Carcteres en mayscula [:lower:] Carcteres en minscula [:digit:] Dgitos [:print:] Carcteres imprimibles hay algunos ms, pero estos son los ms importantes Ahora reescribiremos algunos ejemplos anteriores usando estos conjuntos POSIX:
echo '5895 589435 539853 54849' | grep -o '[[:digit:]]*'
grep encontrara como coincidencias todas las palabras que slo contengan letras alfabticas (inglesas). Tambin se puede elegir el complementario de un conjunto, esto es, los carcteres que no estn en el conjunto. Esto lo haremos con [^conjunto].
echo 'hola 6g hhaif 5345235 AiEo 66' | grep -o '\<[^[:alpha:]]*\>'
grep encontrar como coincidencias todas las palabras que no contengan letras alfabticas (inglesas).
echo 'hola hh-AIf EEE5 A-iEo u.u66ieo' | grep -o '\<[^AIh-z]*\>'
grep encontrar como coincidencias todas las palabras que no contengan letras A, I, de h a z.
El metacarcter parntesis sirve para seleccionar un patrn al que le aplicaremos un metacarcter modificador, por ejemplo *; tiene adems un par de carctersticas bastante interesantes que veremos ms adelante.
echo 'holaholaholahola holahola adios' | grep -o '\(hola\)*'
grep encontrara como coincidencias todas las palabras que contengan repeticiones de la palabra hola
echo 'holahelloholahola holahola adios' | grep -o '\<\(hola\)*\>'
grep encontrara como coincidencias todas las palabras que contengan nicamente repeticiones de la palabra hola Una de las caractersticas interesantes del parntesis que se mencion anteriormente es la de recordar una coincidencia, esto es, el patrn guardar en un registro numrico (del 1 al 9), cada coincidencia que haya coincidido con un patrn que se encuentre entre parntesis. Siendo \1 la primera coincidencia recordada, \2 la siguiente, y as hasta el \9.
echo '6hola6 5hola4 4adios9 7adios7' | grep -o '\<\([0-9]\)[[:alpha:]]*\1\>'
grep encontrar como coincidencias cualquier palabra que empiece con un nmero y acabe con el mismo nmero y entre los nmeros tenga letras.
echo 'NaN LOL Wow TypeT' | grep -o '\<\([[:upper:]]\)[[:alpha:]]*\1\>'
grep encontrar como coincidencias cualquier palabra que empiece con una letra mayscula y acabe con la misma letra y entre las letras maysculas tenga letras.
echo '0990 5785 5775 6996 ' | grep -o '\([[:digit:]]\)\([[:digit:]]\)\2\1'
grep encontrar como coincidencias cualquier nmero capica de cuatro cifras. La otra caracterstica interesante es la de poder elegir entre dos patrones distintos usando \| entre los dos patrones:
echo 'ftp://asdfasf.com http://asfasdf.com' | grep -o '\(ftp\|http\)://[a-z]*\.com'
grep encontrar como coincidencias cualquier palabra que empiece con ftp o http y que contine con un conjunto de letras minsculas y acabe en .com
echo 'ftp://ulises.hostalia.com/debian http://ftp.es.debian.org/debian/' | grep -o '\(ftp\|http\)://[a-z\.-\/]*'
grep encontrar como coincidencias cualquier palabra que empiece con ftp o http y que contine con un conjunto de letras minsculas, puntos, y guiones.
echo 'Yes No S No' | grep -o '\(S\|Yes\)'
grep encontrar como coincidencias cualquier palabra que empiece con 6 o 9 y que acabe con el mismo nmero, con letras en medio.
Con los metacarcteres \{\}, poniendo un nmero o dos entre las llaves se puede elegir el nmero de veces que queremos que se repita un patrn.
echo '555 555555 555555 5555555 55 5555' | grep -o '\<5\{6\}\>'
grep encontrar las palabras formadas por entre tres y seis cincos. Tambin las podemos mezclar con otros metacarcteres
echo '555 asd#lha sdf 55hi5 555aASasd55 55 5555' | grep -o '.\{4,11\}'
grep encontrar como coincidencias cualquier palabra con entre 4 y 11 carcteres, el resultado puede parecer raro, pero la explicacin es sencilla: el metacarcter "." significa cualquier carcter, incluido el espacio, y grep tiende a buscar la palabra ms grande que se adapte al patrn. As que para conseguir el efecto deseado:
echo '555 asd#lha sdf 55hi5 555aASasd55 55 5555' | grep -o '[[:alnum:]#]\{4,11\}'
Por si lo estaba pensando, con \<\> y el punto tampoco conseguira el resultado que se buscaba, ya que el punto seguira significando cualquier carcter incluido el espacio, comprubelo usted mismo.
echo 'http://www.esdebian.org/que-haces https://encrypted.google.com/' | grep -o 'https\{0,1\}[[:alnum:]:\/_-.]*'
Como habr podido comprobar el metacarcter \{\} slo afecta al elemento ms cercano a l, entonces, cmo aplicarselo a un grupo?. Fcil con \(\).
echo 'http://www.esdebian.org/que-haces www.esdebian.org/que-haces' | grep -o '\(http://\)\{0,1\}[[:alnum:]\/_-.]*'
2.9. ^ $
Los ltimos metacarcteres de este tutorial son ^ y $, estos dos metacarcteres sirven para buscar coincidencias al principio y al final de una lnea respectivamente.
echo 'hola hola hola' | grep '^hola'
grep slo coincidir con el primer hola, debido a que es el que est al principio de la lnea.
echo 'adios adios adios' | grep 'adios$'
grep slo coincidir con el ltimo adios, debido a que es el que est al final de la lnea.
echo -e "Este es el final del tutorial,\nesperamos que lo haya disfrutado y haya aprendido mucho sobre las expresiones regulares.\nesDebian" | grep '^[[:alpha:]]*$'