Escolar Documentos
Profissional Documentos
Cultura Documentos
Muchos no van ms all de sus usos ms bsicos, que si bien cumplen a la perfeccin su funcin son una mnima parte de las posibilidades que nos ofrece. Algunos de estos ejemplos se pueden ejecutar tanto con grep como con egrep (egrep= grep -E), independientemente de que casi siempre se ejecuten con egrep en el post. Espero que os sean de utilidad. Este es el texto que se va a utilizar para trabajar como ejemplo. S, es un fichero de configuracin de un Cluster MySQL de prueba, pero es que no tena otra cosa a mano y no me apeteca preparar un fichero especficamente para esto ;)
[ndb_mgmd] hostname=192.168.0.10 node datadir=/var/lib/mysql-cluster files # Options for data node "A": [ndbd] hostname=192.168.0.30 datadir=/usr/local/mysql/data files # Options for data node "B": [ndbd] hostname=192.168.0.40 datadir=/usr/local/mysql/data files # SQL node options: [mysqld] hostname=192.168.0.20 be # specified for this node for various # purposes such as running ndb_restore) # (one [ndbd] section per data node) # Hostname or IP address # Directory for this data node's data # Hostname or IP address of management # Directory for management node log
Podemos hacer uso de los corchetes [] para definir, dentro de una misma string, que una seccin contenga nicamente X carcteres, un rango de ellos, etc. En este caso queremos sacar nicamente los resultados que contengan 192.168.0.30 y 192.168.0.40:
$ egrep 192.168.0.[30,40] test hostname=192.168.0.30 hostname=192.168.0.40 # Hostname or IP address # Hostname or IP address
Pero si quisiramos definir los rangos que queremos mostrar para los dos ltimos caracteres, en este caso numricos (se podra hacer con alfanumricos) podemos hacerlo separando el valor inicial y el final con -. En este ejemplo queremos que nos muestre aquello que cumpla la condicin de que el primer nmero del ltimo bloque tiene que ser 0,1 2:
$ egrep 192.168.0.[0-2]0 test hostname=192.168.0.10 node hostname=192.168.0.20 # Hostname or IP address of management # Hostname or IP address
Y en este que el primer nmero del ltimo bloque sea 1,2 3 y el ltimo entre 0 y 9:
$ egrep 192.168.0.[0-3][0-9] test hostname=192.168.0.10 # Hostname or IP address of management node hostname=192.168.0.30 # Hostname or IP address hostname=192.168.0.20 # Hostname or IP address
Un ejemplo prctico con caracteres alfanumricos sera usar por ejemplo [a-c]test, que buscara atest, btest y ctest por ejemplo [ar4d]test que buscara atest, rtest, 4test y dtest.
Lo que hace cada una de ellas est claro por su nombre, no obstante vamos a ver un ejemplo. Podemos buscar toda lnea que contenga un carcter en maysculas:
$ egrep [[:upper:]] test hostname=192.168.0.10 node datadir=/var/lib/mysql-cluster files ... ... # Hostname or IP address of management # Directory for management node log
Esto es sencillo, las lneas comienzan por el carcter ^ y terminan con $. Por lo que: Buscar todo lo que comience por hostname:
$ egrep ^hostname test hostname=192.168.0.10 node hostname=192.168.0.30 hostname=192.168.0.40 hostname=192.168.0.20 # Hostname or IP address of management # Hostname or IP address # Hostname or IP address # Hostname or IP address
Ms expresiones regulares
Ya hicimos un artculo sobre ello hace tiempo, podis revisarlo aqu: unix: Expresiones regulares, ah tambin encontraris unos cuantos ejemplos de grep. Son muy tiles los operadores de repeticin:
? una vez. * + {n} {n,} {,m} {n,m} El carcter que precede es opcional y coincide al menos El El El El El El carcter carcter carcter carcter carcter carcter que que que que que que precede precede precede precede precede precede coincidir coincidir coincidir coincidir coincidir coincidir 0 o ms veces. 1 o ms veces. exactamente n veces. n o ms veces. como mximo m veces. entre n y m veces.
Podemos entonces buscar todas las lneas del fichero que contienen una IP. Usamos primero los corchetes para definir que puede haber nmeros del 0 al 9, con las llaves decimos que habr 1 o 3 nmeros en cada bloque y as cuatro veces (nota: hay que escapar las llaves):
$ grep '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}' test hostname=192.168.0.10 # Hostname or IP address of management node hostname=192.168.0.30 # Hostname or IP address hostname=192.168.0.40 # Hostname or IP address hostname=192.168.0.20 # Hostname or IP address
Uso de pipes
Todos usamos pipes (|) para acotar resultados. Hacemos un primer grep, con el resultado de ese hacemos otro y as sucesivamente:
$ grep -iw hostname test | grep 192.168.0.[0-9]0 | grep -v 192.168.0.40 | grep -vw node hostname=192.168.0.30 # Hostname or IP address hostname=192.168.0.20 # Hostname or IP address
Si -n nos monstraba el n de lnea en el que estaba la coincidencia, -c nos dice cuantas veces est la bsqueda en el fichero:
$ grep -c hostname test 4