Guía de comandos básicos - Parte IV

Buscando coincidencias de patrones en archivos y directorios

Para buscar información sobre el contenido de archivos que coincidan con un patrón usamos el comando grep

Para buscar un archivo sobre el sistema operativo se usa el comando find.

grep

grep es una utilidad de la línea de comandos escrita originalmente para ser usada con el sistema operativo Unix. Usualmente, grep toma una expresión regular de la línea de comandos, lee la entrada estándar o una lista de archivos, e imprime las líneas que contengan coincidencias para la expresión regular.
Su nombre deriva de un comando en el editor de texto ed que tiene la siguiente forma:
g/re/p
y significa «hacer una búsqueda global para las líneas que encajen con la expresión regular (regular expression en inglés), e imprimirlas». Hay varios argumentos que se pueden usar con grep para modificar el comportamiento por defecto.
Existen otros retroacrónimos (incorrectos) para el nombre, entre ellos: General Regular Expression Parser (analizador general de expresiones regulares), General Regular Expression Print (imprimir expresión regular general), y Global Regular Expression Print (imprimir expresión regular global), éste último no tan lejano de la realidad”.

La información del grep fue tomada de aquí


La sintaxis del comando es:
grep opción patron nombre_del_archivo
Algunas de las opciones disponibles para el comando grep

Opción Descripción
-l
Lista el nombre de archivo del patrón de ocurrencia
-i
Realiza la búsqueda por minúsculas o mayúsculas
-n
Coloca el número de linea de cada ocurrencia
-v
Imprime las lineas que no corresponden a la búsqueda del patrón
-c
Contador de lineas que contienen el patrón

Ejemplos:
dario@Leon:/etc$ grep -n dario group
5:adm:x:4:dario
15:dialout:x:20:dario
18:cdrom:x:24:dario
35:plugdev:x:46:dario
45:lpadmin:x:106:dario
60:admin:x:121:dario
61:dario:x:1000:
62:sambashare:x:122:dario
dario@Leon:/etc$

Vemos que con la opción -n se coloca la linea en la que aparece el patrón.

dario@Leon:/etc$ grep -v localhost hosts

# The following lines are desirable for IPv6 capable hosts
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
dario@Leon:/etc$

Se imprimen las lineas que no contienen el patón localhost en el archivo hosts.

El comando grep soporta metacaracteres a continuación algunos de los metacarecteres que pueden ser usados:

Patrón Estructura Uso Resultado
^ '^item' Comienzo de línea
Encuentra todas las líneas que comienzen con item.
$ 'item$' Final de línea
Encuentra todas las líneas que finalizaen con item.
. 'i..m' Caracter cualquiera
Encuentra las que lineas que contengan el item que comienze con i seguido de 2 caracteres cualesquiera y finaliza con m.
[] '[0123]' Estructura de soporte
Coincidencia de un solo caracter por lo menos.
* '*item' Coincidencia una o mas veces
El item que precede coincida una o mas veces.

Ejemplos:
dario@Leon:~/ejemplos$ grep '^dario' archivogrep
dario leon
dario@Leon:~/ejemplos$

dario@Leon:~/ejemplos$ grep 'persona$' archivogrep
Otra persona
dario@Leon:~/ejemplos$

dario@Leon:~/ejemplos$ grep '[1]' archivogrep
coincidencia de 1 o mas veces
dario@Leon:~/ejemplos$

find

Dicho comando (buscar sería una traducción del comando) permite buscar por la coincidencia de un archivo sobre un directorio, grupos de directorios o todos los sistemas de archivos.

La sintaxis del comando es como sigue:
find ruta expersión acción
Ruta: Refiere a donde comenzaremos la búsqueda

Expresión: Refiere al criterio de búsqueda que estaremos aplicando, usando multiples expresiones utiliza la expresión boleana and.

A continuación algunas expresiones posibles:


Expresión Uso
(+ ó -)n
+ mayor que, - menor que, n igual a.
-name nombre_de_archivo
-name es el mas usado y refiere a la busqueda por nombre de archivo.
-atime (+ ó -)n
Busqueda por el tiempo de acceso a un archivo +n mayor al número de días, -n menor al numero de días, n igual al número de días.
-mtime (+ ó -)n
Busqueda por el tiempo de modificación de un archivo +n mayor al número de días, -n menor al numero de días, n igual al número de días.
-user name
Propietario del archivo.

Acción: Refiere a que se ejecutara sobre un archivo, a continuación una tabla con algunas posibles ejecuciones:

Acción Uso
-exec command {} \;
Ejecutar un comando sobre cada coincidencia del archivo lo delimita el uso de las llaves {}, delimita el comando el uso del signo \; (un espacio entre llaves y backslash es necesario,
-ok command {} \;
Sobre las coincidencias del archivo seran ejecutados el comando pero de forma interactivo, el resto de la construcción del comando sera como el apartado anterior.
-ls
Lista la ruta de la coincidencia.

Algunos ejemplos:

dario@Leon:~$ find . -name archivofind
./ejemplos/directorio2/subdir1/suddir2/subdir3/archivofind
./ejemplos/directorio6/subdirectorio1/subdirectorio2/archivofind
find: `./.config/menus': Permission denied
dario@Leon:~$

dario@Leon:~$ find . -atime +100 -ls
find: `./.config/menus': Permission denied
276965 16 -rw-r--r-- 1 dario dario 14420 Apr 14 2009 ./.openoffice.org/3/user/config/web.soc
276969 16 -rw-r--r-- 1 dario dario 13132 Apr 14 2009 ./.openoffice.org/3/user/config/cmyk.soc
276959 4 -rw-r--r-- 1 dario dario 3919 Apr 14 2009 ./.openoffice.org/3/user/config/sun-color.soc
276972 8 -rw-r--r-- 1 dario dario 4408 Apr 14 2009 ./.openoffice.org/3/user/config/gallery.soc
276971 12 -rw-r--r-- 1 dario dario 10766 Apr 14 2009 ./.openoffice.org/3/user/config/html.soc
276960 48 -rw-r--r-- 1 dario dario 48408 Apr 14 2009 ./.openoffice.org/3/user/config/autotbl.fmt
276946 4 -rw-r--r-- 1 dario dario 567 Apr 14
dario@Leon:~$

dario@Leon:~/ejemplos$ find . -perm u=rw- -ls
383154 0 -rw------- 1 dario dario 0 Nov 7 18:27 ./directorio2/subdir1/suddir2/subdir3/archivofind
383143 4 -rw------- 1 dario dario 77 Nov 7 17:12 ./archivogrep
383433 0 -rw------- 1 dario dario 0 Nov 3 21:47 ./archivo_umask1
383155 0 -rw------- 1 dario dario 0 Nov 7 18:27 ./directorio6/subdirectorio1/subdirectorio2/archivofind
dario@Leon:~/ejemplos$

dario@Leon:~/ejemplos$ find . -exec grep -l dario {} \;
./archivogrep
./archivo
dario@Leon:~/ejemplos$

El comando aterior permite realizar la localización de todos los archivos que contengan el patrón dario en su contenido.

dario@Leon:~/ejemplos$ find . -exec rm archivo {} \;

Remueve del sistema operativo todos los archivos desde el directorio donde esta el usuario en adelante sin ser interactivos.

Comandos para administrar procesos

El comando ps

EL comando ps (process status) muestra información acerca de los procesos que estén siendo usados sobre el sistema operativo, si el comando se ejecuta sin opciones mostrara:
PID de los procesos que estan siendo ejecutados, el pseudo terminal, el tiempo acumulativo y el comando.
dario@Leon:~$ ps
PID TTY TIME CMD
18562 pts/6 00:00:00 ps
20037 pts/6 00:00:00 bash
dario@Leon:~$

Si lo usamos con la opción -e nos despliega una salida igual a la anterior pero de todos los comandos que estan siendo ejecutados sobre el sistema operativo.

Si lo usamos con la opción -f nos mostrara el detalle completo, incluyendo opciones como el PPID y el dueño del proceso.

El comando pgrep

El comando pgrep (hacer una búsqueda global por procesos para las líneas que encajen con la expresión regular (regular expression en inglés), e imprimirlas) busca por la ocurrencia de algún comando.
Generalmente se puede usar con las opciones -lf para ver la ruta completa del comando y su PID.

Ejemplo:

dario@Leona:~$ pgrep -lf firefox
3905 /usr/lib/firefox-3.0.8/firefox
dario@Leona:~$

El comando kill

Matar, detener, permite enviar una señal a un comando, se usa el comando la opción de ser necesario, seguido del PID, el detalle acerca de las señales posibles lo encontramos en man -s 3HEAD signal.

De la salida del comando pgrep usaremos su PID (3905) y esto detendra el proceso, si lo usamos sin opciones la señal por defecto sera la señal 15, si deseamos que el proceso se detenga de inmediato usamos la señal 9.

Ejemplo:

dario@Leona:~$ kill 3905
dario@Leona:~$ pgrep -lf firefox
dario@Leona:~$

El comando pkill

Process pkill (matar o detener un proceso) ejecuta la misma tarea de kill pero en vez del PID del proceso se usa el nombre del proceso.

Ejemplo:

dario@Leona:~$ pkill firefox
dario@Leona:~$ pgrep -lf firefox
dario@Leona:~$