Curso Básico de UNIX
Filtros.
sort
grep
find
fgrep y egrep
tr
uniq
dd
Preguntas y Ejercicios
Bibliografía y Referencias
Se da el nombe de filtros a un grupo de comandos que leen alguna entrada,
realizan una transformación y escriben una salida. Además
de los que veremos aquí, incluye comandos tales como head,
tail,
wc, y cut.
sort
La comparación u ordenación puede ser por caracteres ASCII
o por valor numérico. La ordenación ASCII es la más
parecida a la alfabética; sigue el orden del juego de caracteres
ASCII. En este ordenamiento, los caracteres idiomáticos (vocales
acentuadas, ñ) no se encuentran en el orden alfabético tradicional.
En la ordenación numérica se respeta la ordenación
por valor numérico de la cadena de caracteres: 101 va después
de 21; en ordenamiento ASCII sería al revés.
sort arch1
ordena según el código ASCII.
sort -n arch2.num
ordena numéricamente.
Si no se indican campos de ordenación, la comparación
se hace sobre toda la línea. Si se indican campos, la comparación
se hace considerando la cadena de caracteres iniciada en el primer caracter
del primer campo hasta el último caracter del último campo.
sort -t: -k1,3 arch1.txt
ordena por campos separados por ":", tomando en cuenta para la comparación
los caracteres desde el primero del campo 1 hasta el último del
campo 3.
sort -t: -k1.3,3.5 arch1.txt
ordena por campos tomando en cuenta desde el 3er. caracter del campo 1
hasta el 5to. caracter del campo 3.
sort -nr arch2.num
ordena en orden numérico descendente.
sort -k3 arch3.txt
ordena alfabéticamente, usando como cadena de comparación
la comprendida desde el primer caracter del 3er. campo hasta el fin de
lína. Como no se indica separador, los campos se definen por blancos
(espacio o tabulador).
find
El comando find explora una rama de directorios buscando archivos
que cumplan determinados criterios. El comando find en GNU es
extremadamente potente, permitiendo criterios de búsqueda tales
como:
-
el nombre contiene cierta cadena de caracteres o aparea con algún
patrón:
-
son enlaces a ciertos archivos;
-
fueron usados por última vez en un cierto período de tiempo;
-
tienen un tamaño comprendido dentro de cierto intervalo;
-
son de cierto tipo (regular, directorio, enlace simbólico, etc.);
-
pertenecen a cierto usuario o grupo;
-
tienen ciertos permisos de acceso;
-
contienen texto que aparea con cierto patrón.
Una vez ubicados los archivos, find puede realizar diversas acciones
sobre ellos:
-
ver o editar;
-
guardar sus nombres en otro archivo;
-
eliminarlos o renombrarlos;
-
cambiar sus permisos de acceso;
-
clasificarlos por grupos.
find /var -name *.log -print
busca en el directorio /var los archivos terminados en .log, imprime sus
nombres en la salida.
find /tmp -size +200k -print
busca archivos mayores de 200k. En los argumentos numéricos, +N
es mayor que N, -N es menor que N, N es exactamente igual a N.
find /var/spool/mail -atime +30 -print
busca archivos no accedidos hace más de 30 días. La opción
-atime se refiere a tiempo transcurrido desde última lectura, -mtime
desde última modificación de estado o permisos, -ctime de
contenido.
find /var/tmp -empty -exec rm {} \;
busca archivos vacíos y los borra.
find /home -nouser -ls
busca archivos en los cuales en lugar del nombre de usuario dueño
aparece un número (UID). Esta situación se da cuando la cuenta
de usuario ha sido borrada pero han permanecido los archivos creados por
ese usuario.
grep
El comando grep (Global Regular Expression and Print) permite
buscar las líneas que contienen una cadena de caracteres especificada
mediante una expresión regular. Lee la entrada estándar o
una lista de archivos y muestra en la salida sólo aquellas líneas
que contienen la expresión indicada. La sintaxis es
grep patrón archivos
donde el patrón a buscar es una expresión regular.
-
Crear un archivo con los días de la semana, uno por línea;
llamarle dias.
-
grep martes dias
-
grep tes dias
-
muestra las líneas del archivo dias que contienen la cadena "tes".
-
-
grep unix01 /etc/passwd
-
grep unix0[1-9] /etc/passwd
-
-
ls -l /usr | grep '^d'
-
lista sólo los subdirectorios del directorio /usr (la línea
empieza con "d").
-
-
ls -l / | grep '.......rw'
-
lista sólo los archivos que otros pueden leer y escribir en el directorio
principal.
-
-
grep '^[^:]*::' /etc/passwd
-
busca usuarios sin contraseña; caracteres al principio de línea
que no sean ":", y luego "::" (el segundo lugar, que es el de la contraseña,
está vacío).
-
-
grep '^[^:]*:\*:' /etc/passwd
-
busca usuarios que no pueden entrar al sistema; tienen un * en el lugar
de la contraseña; \ escapa el significado del segundo *, que vale
como caracter a buscar.
Ninguna expresión regular de grep aparea con un caracter
nueva línea; las expresiones se aplican individualmente a cada línea.
Entre las opciones de grep se cuentan -i para evitar distinguir
entre mayúsculas de minúsculas, -n para mostrar el número
de línea y -v para buscar líneas que no contengan la expresión
regular indicada.
fgrep y egrep
Hay dos versiones de grep que optimizan la búsqueda en casos particulares:
fgrep (fixed grep, o fast grep) acepta solamente una cadena
de caracteres, y no una expresión regular, aunque permite buscar
varias de estas cadenas simultáneamente;
egrep (extended grep), que acepta expresiones regulares extendidas
con los operadores + ? | y paréntesis.
fgrep no interpreta metacaracteres, pero puede buscar muy eficientemente
muchas palabras en paralelo, por lo que se usa mucho en búsquedas
bibliográficas; egrep acepta expresiones más complejas,
pero es más lento; grep es un buen compromiso entre ambos.
-
fgrep martes dias
-
busca la cadena martes en el archivo dias.
-
-
En fgrep y egrep puede indicarse la opción
-f
buscar.exp, donde buscar.exp es un archivo que contiene la
expresión a buscar: cadenas simples para fgrep, expresiones
regulares para egrep, separadas por nueva línea; las expresiones
se buscan en paralelo, es decir que la salida serán todas las líneas
que contengan una cualquiera de las expresiones a buscar.
-
Crear un archivo buscar.fgrep con las cadenas "tes" y "jue", una
por línea. El comando
-
fgrep -f buscar.fgrep dias
-
extrae del archivo dias las líneas que contienen estas
cadenas.
-
-
El comando grep soporta fgrep y egrep como opciones
-F y -E, respectivamente.
-
grep -F -f buscar.fgrep dias
-
egrep "tes|jue" dias
-
grep -E "tes|jue" dias
-
obtienen el mismo efecto del comando anterior.
-
egrep "([0-9]+ab)*1234" archivo
-
busca cadenas comenzadas opcionalmente por un dígito y los caracteres
ab, todo el paréntesis 0 o más veces, y hasta encontrar la
cadena 1234.
-
-
Escribir grep -E es similar a egrep, aunque no idéntico;
egrep
es compatible con el comando histórico egrep;
grep
-E acepta expresiones regulares extendidas y es la versión
moderna del comando en GNU. fgrep es idéntico a grep
-F.
tr
El comando tr translitera los caracteres de la entrada: sustituye
unos caracteres por otros. La sustitución es caracter a caracter.
Entre sus opciones se encuentran -d para borrar caracteres; -c para sustituir
complemento de los caracteres indicados, es decir, que no sean ésos;
y -s para comprimir caracteres repetidos en uno solo.
-
cat dias | tr a-z A-Z
-
convierte todo a mayúsculas.
-
cat dias | tr -d aeiou
-
borra todas las vocales del archivo dias.
-
-
Agregar al archivo dias líneas en blanco, varias seguidas,
intercaladas entre los nombres de los días.
-
cat dias
-
cat dias | tr -s "\n*"
-
convierte varios caracteres nueva línea seguidos en una solo; elimina
renglones en blanco.
-
-
cat nota | tr -c "[a-zA-Z0-9]" "_"
-
transforma todos los caracteres que no sean letras o números en
subrayas.
-
cat nota | tr -cs "[a-zA-Z0-9]" "[\n*]"
-
transforma todos los caracteres que no sean letras o números en
nuevalínea, y comprime las nuevalíneas repetidas en una sola;
deja cada palabra sola en un renglón.
-
-
ls -l /usr | tr -s " " | cut -f3,4
-
comprime los blancos en la salida para poder cortar campos.
uniq
El comando uniq excluye todos los renglones adyacentes duplicados
menos uno; es decir, elimina renglones repetidos consecutivos. La opción
-c escribe el número de ocurrencias al comienzo del renglón.
El siguiente ejemplo muestra las 5 palabras más frecuentes en el
conjunto de archivos:
cat *.txt | tr -sc A-Za-z '\012' | \
sort | uniq -c | sort -n | tail 5
cat lista todos los archivos, tr comprime el renglón
eliminando blancos, sort los ordena, uniq cuenta las
ocurrencias y elimina repetidos, sort -n ordena por cantidad de
ocurrencias y tail muestra las 5 ocurrencias más frecuentes.
dd
El comando dd es un convertidor de datos: convierte de ASCII a
EBCDIC y a la inversa, cambia los tamaños de los bloques de registros,
hace ajuste de blancos y otras transformaciones usuales cuando se manejan
transferencias entre sistemas operativos distintos o datos en bruto, sin
formato, como en los respaldos en cinta.
Bibliografía y Referencias.
Comandos: sort, find, grep, fgrep, egrep, tr, uniq, dd
Referencias: páginas man, nodos info, Kernighan-Pike[1987],
Coffin[1989].
Víctor A. González Barbone vagonbar en fing edu uy
Instituto de Ingeniería Eléctrica
- Facultad de Ingeniería -
Montevideo, Uruguay.