Cosas del GREP y el FIND
$ which Despliega en qué directorio se encuentra un
archivo.
Ejemplo: $ which ls
mount -t vfat /dev/fd0 /mnt/floppy
umount -t vfat /dev/fd0
Hacer ejecutable:
>chmod 755 script
o
>chmod a+x script
Ejecutarlo:
>./script
GREP
Usage: grep [OPTION]... PATTERN [FILE] ...
Search for PATTERN in each FILE or standard input.
Example: grep -i 'hello world' menu.h main.c
Pa sacar cosas:
grep 'http' < sucio.txt > limpio.txt
(Saca de sucio.txt todas las líneas -y solo ellas- que tengan la palabra
http y las mete en limpio.txt)
Regexp selection and interpretation:
-E, --extended-regexp PATTERN is an extended regular expression
-F, --fixed-strings PATTERN is a set of newline-separated strings
-G, --basic-regexp PATTERN is a basic regular expression
-e, --regexp=PATTERN use PATTERN as a regular expression
-f, --file=FILE obtain PATTERN from FILE
-i, --ignore-case ignore case distinctions
-w, --word-regexp force PATTERN to match only whole words
-x, --line-regexp force PATTERN to match only whole lines
-z, --null-data a data line ends in 0 byte, not newline
Miscellaneous:
-s, --no-messages suppress error messages
-v, --invert-match select non-matching lines
-V, --version print version information and exit
--help display this help and exit
--mmap use memory-mapped input if possible
Output control:
-b, --byte-offset print the byte offset with output lines
-n, --line-number print line number with output lines
-H, --with-filename print the filename for each match
-h, --no-filename suppress the prefixing filename on output
-q, --quiet, --silent suppress all normal output
--binary-files=TYPE assume that binary files are TYPE
TYPE is 'binary', 'text', or 'without-match'.
-a, --text equivalent to --binary-files=text
-I equivalent to --binary-files=without-match
-d, --directories=ACTION how to handle directories
ACTION is 'read', 'recurse', or 'skip'.
-r, --recursive equivalent to --directories=recurse.
-L, --files-without-match only print FILE names containing no match
-l, --files-with-matches only print FILE names containing matches
-c, --count only print a count of matching lines per FILE
-Z, --null print 0 byte after FILE name
Context control:
-B, --before-context=NUM print NUM lines of leading context
-A, --after-context=NUM print NUM lines of trailing context
-C, --context[=NUM] print NUM (default 2) lines of output context
unless overridden by -A or -B
-NUM same as --context=NUM
-U, --binary do not strip CR characters at EOL (MSDOS)
-u, --unix-byte-offsets report offsets as if CRs were not there (MSDOS)
`egrep' means `grep -E'. `fgrep' means `grep -F'.
With no FILE, or when FILE is -, read standard input. If less than
two FILEs given, assume -h. Exit status is 0 if match, 1 if no match,
and 2 if trouble.
Ej:
Algo mas complicado:
$ grep ^(f|b)*o(h)+. * # X* = X 0 o mas veces, X+ = X 0 o mas veces , ^X
= X
al principio de linea,
. = cualquier caracter menos \n. X | Y = X o Y. Este ejemplo haceptaria
las palabras siguientes si
se encuentra en el margen izquierdo.
ohx
fbfbohhhhaavvddf
fffohhMAMAMIA
find sirbe para listar todos los archivos de un subarbol. Puede ejecutar
intrucciones por cada archivo:
$ find /usr/include -name "*.h" -exec grep open {} \; -print
por cada archivo de include busca open con grep e imprime el nombre de
archivo despues.
Como buscar texto en subdirectorios ?
Algunos ejemplos:
grep "string" `find . -type f`
find . -type f | xargs grep "string"
find . -type f | xargs fgrep "string" /dev/null
locate $PWD | grep "^$PWD" |xargs fgrep "string" /dev/null
find . \( -type f -name "*\.html" \) -exec grep -l "string" {} \;
Yo suelo usar el de find . -type f | xargs fgrep "string" /dev/null
11.1.7 Ejemplos
Sí, find tiene demasiadas opciones, lo sé. Pero, hay un montón de casos preparados que vale la pena recordar, porque son usados muy a menudo. Veamos algunos de ellos.
$ find . -name foo\* -print
Encuentra todos los nombres de fichero que empiezan con foo. Si la cadena de caracteres está incluida en el nombre, probablemente tiene más sentido escribir algo como , en vez de
``foo''.
$ find /usr/include -xtype f -exec grep foobar \
/dev/null {} \;
Es un grep ejecutado recursivamente que empieza del directorio /usr/include. En este caso, estamos interesados tanto en ficheros regulares como en enlaces simbólicos que apuntan a ficheros regulares, por tanto el test
``-xtype''. Muchas veces es más simple evitar especificarlo, especialmente si estamos bastante seguros de cuáles ficheros binarios no contienen la cadena de caracteres deseada. (¿Y por qué el
/dev/null en el comando? Es un truco para forzar al grep a escribir el fichero del nombre donde se ha encontrado un emparejamiento. El comando grep se aplica a cada fichero con una invocación diferente, y, por lo tanto no cree que sea necesario mostrar a la salida el nombre del fichero. Pero ahora hay dos ficheros, esto es: ¡el activo y
/dev/null! Otra posibilidad podría ser redirigir la salida11.9 del comando a xargs y dejar llevar a cabo el
grep. Yo lo intenté, e hice pedazos completamente mi sistema de ficheros (junto con estas notas que estoy intentando recuperar a mano :-( ).
$ find / -atime +1 -fstype ext2 -name core \
-exec rm {} \;
Es un trabajo clásico para la tabla de tareas preplaneadas. Borra todos los ficheros llamados core en el sistema de ficheros del tipo ext2 al cual no se ha accedido en las últimas 24 horas. Es posible que alguien quiera usar los ficheros de imagen de memoria11.10 para realizar un volcado post mortem, pero nadie podría recordar lo que estuvo haciendo después de 24 horas...
$ find /home -xdev -size +500k -ls > piggies
Es útil para ver quién tiene esos archivos que atascan el sistema de ficheros. Note el uso de
``-xdev''; como sólo estamos interesados en un sistema de ficheros, no es necesario descender otro sistema de ficheros montado bajo
/home.
|