Você está na página 1de 5

Grep es sin duda alguna no de los comandos ms utilizados en el da a da por los administradores de sistemas.

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

# Hostname or IP address # Directory for this data node's data

# Hostname or IP address # (additional mysqld connections can

Buscar dos n strings distintas dentro de un mismo fichero


La sintaxis es (cadena1|cadena2|cadenaN). La salida ser todas aquellas lneas que contienen cualquiera de esas strings. Esto nos permite hacer mltiples bsquedas en un nico comando:
$ egrep '(192.168.0.30|192.168.0.40)' test hostname=192.168.0.30 # Hostname or IP address hostname=192.168.0.40 # Hostname or IP address $ egrep '(192.168.0.30|192.168.0.40|192.168.0.20)' test 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

Usar los corchetes para reducir el rango de bsqueda

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.

Uso de clases predefinidas


Existen clases predefinidas que nos pueden llegar a ahorrar mucho trabajo. Son las siguientes:
[:alnum:], [:alpha:], [:cntrl:], [:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:], [:xdigit:]

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

Todo lo que comienza o termina por

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

O todo lo que termine por node:


$ egrep node$ test hostname=192.168.0.10 node # Hostname or IP address of management

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

Buscar palabras completas, contar resultados


Para indicar a grep que queremos que la bsqueda se centre en palabras y no en caracteres sueltos especificamos el parmetro -w. Podemos ver la diferencia buscando data en el ejemplo, contamos los resultados satisfactorios con el parmetro -c:
$ grep -cw data test 5 $ grep -c data test 6

Excluir resultados, sensibilidad a maysculas


Algo bsico a la hora de usar grep es conocer los parmetros -v que excluye la cadena indicada en el resultado y -i que especifica que no se tendr en cuenta si el resultado es mayscula o minscula. Eliminamos las lneas que tienen comodines:
$ grep -v "#" test [ndb_mgmd] [ndbd] [ndbd] [mysqld]

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

Listar los archivos que contienen la cadena


Con el parmetro -l podemos ejecutar grep contra varios archivos (y de forma recursiva en mltiples directorios con -R) y recibiremos el listado de archivos con coincidencias sin mostrar las lneas que contienen la cadena:
$ grep -lR SQL * config.ini header.xcf iptables.sh test dir1/test.sql dir2/prueba.txt ...

Nmero de lnea en la que se encuentran los resultados


Para saber el nmero de lnea en la que se encuentra el resultado utilizaremos el parmetro -n:
$ grep -n hostname test 2:hostname=192.168.0.10 management node 8:hostname=192.168.0.30 ... # Hostname or IP address of # Hostname or IP address

Cuantas veces se encuentran resultados

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

Você também pode gostar