Filtros.
Se da el nombe de filtros a un grupo de comandos que leen alguna entrada,realizan una transformación y escriben una salida. Ademásde los que veremos aquí, incluye comandos tales como head,tail,wc, y cut.
sort
La comparación u ordenación puede ser por caracteres ASCIIo por valor numérico. La ordenación ASCII es la másparecida a la alfabética; sigue el orden del juego de caracteresASCII. En este ordenamiento, los caracteres idiomáticos (vocalesacentuadas, ñ) no se encuentran en el orden alfabético tradicional.En la ordenación numérica se respeta la ordenaciónpor valor numérico de la cadena de caracteres: 101 va despuésde 21; en ordenamiento ASCII sería al revés. sort arch1ordena según el código ASCII. sort -n arch2.numordena numéricamente.
Si no se indican campos de ordenación, la comparaciónse hace sobre toda la línea. Si se indican campos, la comparaciónse hace considerando la cadena de caracteres iniciada en el primer caracterdel primer campo hasta el último caracter del último campo. sort -t: -k1,3 arch1.txtordena por campos separados por ":", tomando en cuenta para la comparaciónlos caracteres desde el primero del campo 1 hasta el último delcampo 3. sort -t: -k1.3,3.5 arch1.txtordena por campos tomando en cuenta desde el 3er. caracter del campo 1hasta el 5to. caracter del campo 3. sort -nr arch2.numordena en orden numérico descendente. sort -k3 arch3.txtordena alfabéticamente, usando como cadena de comparaciónla comprendida desde el primer caracter del 3er. campo hasta el fin delí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 archivosque cumplan determinados criterios. El comando find en GNU esextremadamente potente, permitiendo criterios de búsqueda talescomo:[list]el nombre contiene cierta cadena de caracteres o aparea con algúnpatró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.[/list]Una vez ubicados los archivos, find puede realizar diversas accionessobre ellos:[list]ver o editar;guardar sus nombres en otro archivo;eliminarlos o renombrarlos;cambiar sus permisos de acceso;clasificarlos por grupos.[/list] find /var -name *.log -printbusca en el directorio /var los archivos terminados en .log, imprime susnombres en la salida. find /tmp -size +200k -printbusca archivos mayores de 200k. En los argumentos numéricos, +Nes mayor que N, -N es menor que N, N es exactamente igual a N. find /var/spool/mail -atime +30 -printbusca archivos no accedidos hace más de 30 días. La opción-atime se refiere a tiempo transcurrido desde última lectura, -mtimedesde última modificación de estado o permisos, -ctime decontenido. find /var/tmp -empty -exec rm {} ;busca archivos vacíos y los borra. find /home -nouser -lsbusca archivos en los cuales en lugar del nombre de usuario dueñoaparece un número (UID). Esta situación se da cuando la cuentade usuario ha sido borrada pero han permanecido los archivos creados porese 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.
A continuación veremos varios ejemplos del uso del comando grep.
Usamos grep para buscar una palabra dentro de un archivo en Linux, pero... ¿hasta donde podemos llegar con su uso?
$ cat archivo_demo1
ESTA ES LA PRIMER LINEA EN MAYUSCULAS DE ESTE ARCHIVO
esta es la primer linea en minusculas de este archivo
Esta Es La Primer Linea Con El Primer Caracter De Cada Palabra Con Mayuscula
Hay dos lineas vacias sobre esta
Y esta es la ultima linea
$ cp /tmp/archivo_demo1 /tmp/archivo_demo2
Uso básico, buscar una cadena en un archivo
$ grep "esta" archivo_demo1
esta es la primer linea en minusculas de este archivo
Hay dos lineas vacias sobre esta
Y esta es la ultima linea
Buscar una cadena en varios archivos
$ grep "esta" archivo_demo*
archivo_demo1:esta es la primer linea en minusculas de este archivo
archivo_demo1:Hay dos lineas vacias sobre esta
archivo_demo1:Y esta es la ultima linea
archivo_demo2:esta es la primer linea en minusculas de este archivo
archivo_demo2:Hay dos lineas vacias sobre esta
archivo_demo2:Y esta es la ultima linea
Buscar sin coincidencia entre mayúsculas y minúsculas (uso del argumento -i)
$ grep -i "esta" archivo_demo1
ESTA ES LA PRIMER LINEA EN MAYUSCULAS DE ESTE ARCHIVO
esta es la primer linea en minusculas de este archivo
Esta Es La Primer Linea Con El Primer Caracter De Cada Palabra Con Mayuscula
Hay dos lineas vacias sobre esta
Y esta es la ultima linea
Buscar expresiones regulares
$ grep "esta.*linea" archivo_demo1
esta es la primer linea en minusculas de este archivo
Y esta es la ultima linea
En este ejemplo buscamos aquellas líneas que contienen la palabra "esta" y luego de cualquier texto (*) continúan con "linea". Para más operadores de expresiones regulares se recomienda leer la documentación del grep.
Buscar palabras completas (excluir subcadenas) (uso del argumento -w)
$ grep -iw "de" archivo_demo1
Buscar N líneas luego de la coincidencia
$ grep -A2 "ESTA" archivo_demo1
ESTA ES LA PRIMER LINEA EN MAYUSCULAS DE ESTE ARCHIVO
esta es la primer linea en minusculas de este archivo
Esta Es La Primer Linea Con El Primer Caracter De Cada Palabra Con Mayuscula
$grep -A1 "ESTA" archivo_demo1
ESTA ES LA PRIMER LINEA EN MAYUSCULAS DE ESTE ARCHIVO
esta es la primer linea en minusculas de este archivo
Buscar N líneas antes de la coincidencia
$ grep -B1 "ultima" archivo_demo1
Hay dos lineas vacias sobre esta
Y esta es la ultima linea
Buscar N líneas alrededor de la coincidencia
$ grep -C1 "minusculas" archivo_demo1
ESTA ES LA PRIMER LINEA EN MAYUSCULAS DE ESTE ARCHIVO
esta es la primer linea en minusculas de este archivo
Esta Es La Primer Linea Con El Primer Caracter De Cada Palabra Con Mayuscula
Resaltar los resultados
Es necesario setear las variables de entorno GREP_OPTIONS y GREP_COLOR
$ export GREP_OPTIONS='--color=auto' GREP_COLOR='100;8'
Buscar en archivos recursivamente (uso del argumento -r)
Cuando necesitas buscar una cadena en los archivos del directorio actual y sus subdirectorios. El siguiente ejemplo buscaría la palabra "auto" en todos los archivos del directorio actual y sus subdirectorios.
$ grep -r "auto" *
Buscar no coincidencias (uso del argumento -v)
$ grep -iv "primer" archivo_demo1
Hay dos lineas vacias sobre esta
Y esta es la ultima linea
Mostrar las lineas de varias no coincidencias (uso del argumento -v y los argumentos -e)
$ cat archivo_demo3
a
b
c
d
$ grep -v -e "a" -e "b" -e "c" archivo_demo3
d
Contar el número de ocurrencias (uso del argumento -c)
$ grep -c "esta" archivo_demo1
3
$ grep -ic "esta" archivo_demo1
5
Mostrar solo los nombres de los archivos los cuales contienen coincidencias (uso del argumento -l)
$ grep -l "esta" archivo_demo*
archivo_demo1
archivo_demo2
Mostrar solo la cadena buscada (uso del argumento -o)
Por defecto el comando grep muesrta la línea completa de la cadena o patrón dado, pero si solo quieres mostrar dicha cadena o patrón puedes utilizar el argumento -o.
Nota la diferencia en el ejemplo:
$ grep "es.*linea" archivo_demo1
esta es la primer linea en minusculas de este archivo
Y esta es la ultima linea
$
$ grep -o "es.*linea" archivo_demo1
esta es la primer linea
esta es la ultima linea
Mostrar la posición en el archivo de la conicidencia (uso de argumento -b)
$ grep -bo "es.*linea" archivo_demo1
54:esta es la primer linea
222:esta es la ultima linea
$
$ grep -bo "es.*linea" archivo_demo*
archivo_demo1:54:esta es la primer linea
archivo_demo1:222:esta es la ultima linea
archivo_demo2:54:esta es la primer linea
archivo_demo2:222:esta es la ultima linea
Mostrar la fila en el archivo de la conicidencia (uso de argumento -n)
$ grep -no "es.*linea" archivo_demo*
archivo_demo1:2:esta es la primer linea
archivo_demo1:7:esta es la ultima linea
archivo_demo2:2:esta es la primer linea
archivo_demo2:7:esta es la ultima linea
Ninguna expresión regular de grep aparea con un caracternueva línea; las expresiones se aplican individualmente a cada línea.
Entre las opciones de grep se cuentan -i para evitar distinguirentre mayúsculas de minúsculas, -n para mostrar el númerode línea y -v para buscar líneas que no contengan la expresiónregular 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 cadenade caracteres, y no una expresión regular, aunque permite buscarvarias de estas cadenas simultáneamente;
egrep (extended grep), que acepta expresiones regulares extendidascon los operadores + ? | y paréntesis.
fgrep no interpreta metacaracteres, pero puede buscar muy eficientementemuchas palabras en paralelo, por lo que se usa mucho en búsquedasbibliográficas; egrep acepta expresiones más complejas,pero es más lento; grep es un buen compromiso entre ambos. fgrep martes diasbusca la cadena martes en el archivo dias. En fgrep y egrep puede indicarse la opción-fbuscar.exp, donde buscar.exp es un archivo que contiene laexpresión a buscar: cadenas simples para fgrep, expresionesregulares para egrep, separadas por nueva línea; las expresionesse buscan en paralelo, es decir que la salida serán todas las líneasque contengan una cualquiera de las expresiones a buscar.Crear un archivo buscar.fgrep con las cadenas "tes" y "jue", unapor línea. El comando fgrep -f buscar.fgrep diasextrae del archivo dias las líneas que contienen estascadenas. 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" diasobtienen el mismo efecto del comando anterior. egrep "([0-9]+ab)*1234" archivobusca cadenas comenzadas opcionalmente por un dígito y los caracteresab, todo el paréntesis 0 o más veces, y hasta encontrar lacadena 1234. Escribir grep -E es similar a egrep, aunque no idéntico;egrepes compatible con el comando histórico egrep;grep-E acepta expresiones regulares extendidas y es la versiónmoderna del comando en GNU. fgrep es idéntico a grep-F.
tr
El comando tr translitera los caracteres de la entrada: sustituyeunos caracteres por otros. La sustitución es caracter a caracter.Entre sus opciones se encuentran -d para borrar caracteres; -c para sustituircomplemento 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-Zconvierte todo a mayúsculas. cat dias | tr -d aeiouborra 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; eliminarenglones en blanco. cat nota | tr -c "[a-zA-Z0-9]" "_"transforma todos los caracteres que no sean letras o números ensubrayas. cat nota | tr -cs "[a-zA-Z0-9]" "[n*]"transforma todos los caracteres que no sean letras o números ennuevalí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,4comprime los blancos en la salida para poder cortar campos.
uniq
El comando uniq excluye todos los renglones adyacentes duplicadosmenos 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 elconjunto de archivos: cat *.txt | tr -sc A-Za-z '12' | sort | uniq -c | sort -n | tail 5cat lista todos los archivos, tr comprime el renglóneliminando blancos, sort los ordena, uniq cuenta lasocurrencias y elimina repetidos, sort -n ordena por cantidad deocurrencias y tail muestra las 5 ocurrencias más frecuentes.
dd
El comando dd es un convertidor de datos: convierte de ASCII aEBCDIC y a la inversa, cambia los tamaños de los bloques de registros,hace ajuste de blancos y otras transformaciones usuales cuando se manejantransferencias entre sistemas operativos distintos o datos en bruto, sinformato, como en los respaldos en cinta.