lunes, 29 de junio de 2015

FILTROS EN LINUX


FILTROS EN LINUX

Se da el nombe de filtros a un grupo de comandos que leen alguna entrada,realizan una transformación y escriben una salida.

para mostrar la entrada: cat
para seleccionar una parte de la entrada: grep, tail, head y cut
para paginar la entrada: less y more
para ordenar la entrada: sort
para alterar la entrada en forma ordenada: tr 
para comparar dos entradas: comm y diff 
para contar la entrada: wc
COMANDO SORT Y UNIQ

sort

Ordenar líneas de los archivos de entrada a partir de criterios de ordenación. Los espacios en blanco son tomados por defecto como separadores de campo.
 sintaxis: sort [opciones] [archivo]
Alguno de sus opciones son:
-b Ignora espacios en blanco precedentes.
-d Ordena ignorando todos los caracteres salvo caracteres letras, números y espacios.
-f considera iguales las mayúsculas y minúsculas.
-n ordena por valor numérico.
-r invertirá el orden.
-k n1,[n2] Especifica un campo como clave de ordenación, comienza en n1 y acaba en n2; los números de campo empiezan en 1. En versiones antiguas existía la opción +1, la cual indicaba a sort que debía ordenarse tomando la segunda columna de datos, usándose +2 para la tercera y así sucesivamente, (los números de campo empezaban en 0).
-o salida.txt Escribir el resultado en salida.txt.
Ejemplos de uso, para lo cual se tomara como ejemplo el archivo pepe.txt cuyo contenido es:
# cat pepe.txt
     15 windows
     16 acer
      2 actualizacion
      1 actualizada
      3 admiral
      2 www
      1 agregar
     10 aires
      1 al
      1 algunos
      1 empleos
     60 en
      2 equipo
     45 archivos
      3 word
sort pepe.txtOrdena el archivo pepe.txt
sort -k 1 pepe.txt Ordena el archivo usando el primer campo como clave de ordenación. Tiene el mismo efecto que sort pepe.txt
sort -k 2 pepe.txt Ordena el archivo usando el segundo campo como clave de ordenación.
sort -n pepe.txt Ordena el archivo por valor numérico.
sort -nr pepe.txt Ordena el archivo por valor numérico de mayor a menor (invierte el orden).
sort -t @ -k 2,2 pp.txt ordena el archivo pp.txt por el segundo campo, y el separador de campo que utilizo es el @ arroba.

Un ejemplo de uso práctico es si tengo una lista desordenada (de por ejemplo una palabra por fila) y quiero averiguar cuantas veces se repite cada palabra, para lo cual puede usar el comando:

sort -bdf lista | uniq -ic | sort –nr


Donde sort -bdf lista ordenará la lista, para que el comando uniq -ic pueda contar el número de líneas iguales (considera iguales las mayúsculas y minúsculas), por último ejecuto sort -nr para que ordene la lista por la palabra que se repite más.
# cat ejemplo.txt
mama
pepe
hola
Hola
pepe
Hola
si
no
Mama
www
# sort -bdf ejemplo.txt | uniq -ic | sort -nr
      3 hola
      2 pepe
      2 mama
      1 www
      1 si
      1 no


Este comando es utilizado en conjunto con el comando uniq, ya que para encontrar lineas duplicadas consecutivas primero hay que ordenar el contenido del archivo.


Ordenamiento por carácter y numérico

[ian@echidna lpi103-2]$ cat text1 | tr ' ' '\t' | sort - text2
10      apple
1       apple
2       pear
3       banana
3       banana
9       plum
[ian@echidna lpi103-2]$ cat text1|tr ' ' '\t'|sort -u -k1n -k2 - text2
1       apple
2       pear
3       banana
9       plum
10      apple

COMANDO FIND

Busca ficheros en un árbol de directorios 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.

Ejemplos:
find /etc -type f -name "*.dcm" 
busca archivos con la extensión dcm en el directorio /etc  actual y en los subdirectorios.

find . -type f -name "*.dcm" 
busca archivos con la extensión dcm en el directorio actual . y en los subdirectorios.

find . -type f -name "*.dcm" -exec cp -f {} /media/clientes/00 \;
 Busca archivos con la extensión dcm en el directorio actual . y en los subdirectorios. Los archivos encontrados los copia en   la carpeta /media/clientes/00

find -iname patron ídem que -name patron pero ignora mayúsculas y minúsculas.
find /var -newer /tmp/service 
encuentra ficheros en /var que hayan sido modificados más recientemente que el fichero /tmp/service. En vez de usar la opción-newer fichero también se podría usar la opción -anewer fichero se ha accedido al fichero por última vez más recientemente que cuando fichero fue modificado, o la opción -cnewer fichero el status del fichero se cambió por última vez más recientemente que cuando se modificó fichero.

find -inum N Busca archivos cuyo número de inodo sea N.

find -maxdepth 1 -type f| xargs grep -F 'ejemplo' buscar ejemplo en todos los archivos regulares de este directorio. Es similar a ejecutar grep -i "ejemplo" *

find -type f -print0 | xargs -r0 grep -F 'ejemplo' busca la palabra ejemplo en todos los archivos regulares en este directorio y subdirectorios. Es similar a ejecutar grep -ir "ejemplo" *

find / -iname pp 2 > /dev/null para que no ensucie la pantalla con find: «/var/log/..»: Permiso denegado

sudo find / -nouser 2 > /dev/null lista los archivos de usuarios que ya no existen.

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.

 COMANDO 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.
Cualquier meta-carácter con un significado especial debe ser protegido precediéndolo con una barra inclinada inversa (\ ). Algunos patrones de grep se encierran entre '..' (apóstrofos) para indicarle que no es un metacarácter del sehll. También existe en su versiónzgrep para buscar en archivos comprimidos.
La sintaxis es:
grep [opciones] 'patrón' archivos
Donde el patrón a buscar es una expresión regular. Ejemplos
grep "ejemplo" * 
listara las lineas que concuerden con la cadena ejemplo de "todos" los archivos del directorio actual.

grep -i hola pp.txt considera idénticas las mayúsculas y minúscula en la cadena de búsqueda hola. (hola=HOLA=Hola=etc.).

grep -ri "hola" ./ busca en los archivos del directorio actual y los subdirectorios la palabra hola.

grep -v hola pp.txt lista las líneas que no contengan la cadena hola del archivo pp.txt

grep -n hola pp.txt las líneas concordantes con la cadena hola del archivo pp.txt se mostrarán acompañadas del número de línea.

grep -w sobre pp.txt listara solamente aquellas líneas que contienen concordancias que forman palabras completas.

grep -A 2 hola pp.txt muestra 2 líneas de contexto después de las que concuerden con el patrón hola.

grep -B 2 hola pp.txt muestra 2 líneas de contexto antes de las que concuerden con el patrón hola.
grep -f patron.txt pp.txt obtiene el patrón de fichero patron.txt y listara líneas concordantes del archivo pp.txt

grep -s "ejemplo" * suprime los mensajes de error sobre ficheros que no existen o no se pueden leer.

grep [123] pp.txt listara las lineas que contengan los números 1, 2 o 3
grep '^L' pp.txt lista las lineas de pp.txt que comiencen la línea con el carácter L, el carácter ^ denota inicio de cadena.

grep 'h$' pp.txt lista las líneas de pp.txt que terminen en h, el carácter $ denota fin de cadena.

grep '\<pe' pp.txt muestra todas las líneas de pp.txt que contengan palabras que comiencen con la cadena pe.

grep '\>pe' pp.txt muestra todas las líneas de pp.txt que contengan palabras que finalicen con la cadena pe.

grep 'xy*' pp busca en pp una x seguida por la secuencia más larga de y.

grep '^[^#]' pp.txt muestra pp.txt, ocultando las líneas que empiezan por # y las líneas vaciás.

grep -o patron archivo muestra solo la parte de la linea que coincide con el patrón.

grep --color=always '\bing[[:space:]]' pp.txt | less -R la palabra ing seguida de un espacio sera coloriada y esta redirigida al comando less sin perder el color.

grep -Eio '([[:alnum:]_.-]+@[[:alnum:]_.-]+?\.[[:alpha:].]{2,6})' archivo.txt muestra solo las direcciones de e-mail (no todo la linea que la contiene), del archivo.txt.

cat uu.txt | grep -oE '.*111111' muestra desde el principio de la linea hasta la ocurrencia 111111

COMANDO 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.

 COMANDO 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.

 COMANDO SED

Lee un renglón a la vez a partir de los archivos de la entrada, aplica los comandos de la lista, por orden, a cada renglón y escribe su forma editada en la salida estándar, las comillas son necesarias porque muchos de los metacaracteres de sed significan también algo para el shell (sed no altera los contenidos de la entrada), sed reconoce los comandos de grep, egrep y de fgrep.
Su sintaxis es de la forma:
sed [opciones] ´[comandos]´ archivos-de-entrada.
Algunas de sus opciones son:
·         i, Insertar línea antes de la línea actual.
·         a, Insertar línea después de la línea actual.
·         c, Cambiar línea actual.
·         d, Borrar línea actual.
·         p, Imprimir línea actual en salida estándar.
·         s, Sustituir cadena en línea actual.
·         r archivo Añadir contenido de “archivo” a la línea actual.
·         w archivo Escribir salida a un archivo.
·         ! Aplicar instrucción a las líneas no seleccionadas por la condición.
·         q, Finalizar procesamiento del archivo.
sed '3d' archivo.txt borra la tercera línea de archivo.txt
sed '3p' archivo.txt imprime dos veces linea 3 del archivo archivo.txt
sed '2q' archivo.txt muestra hasta la linea 2 del archivo.txt
sed '=' archivo.txt imprime los números de línea del archivo.txt.
sed 's/hola/pepe/' archivo.txt sustituye la primera aparición en cada línea de hola por pepe en archivo.txt
sed 's/hola/pepe/g' archivo.txt remplaza la palabra hola por pepe del fichero archivo.txt en todas las apariciones
sed '1,3s/hola/pepe/g' archivo.txt todas las veces que aparezca hola se reemplace por pepe, pero solo hasta la línea 3, inclusive.
sed '/^$/d' fichero borrar las líneas en blanco del archivo.txt
sed 's/]*>//g;/' archivo2.txt elimina la etiquetas HTML del archivo archivo2.txt
También se puede especificar un rango de caracteres de la forma:
[:alnum:]Alfanumérico [a-z A-Z 0-9]
[:alpha:]Alfabético [a-z A-Z]
[:blank:]Espacios o tabuladores
[:cntrl:]Cualquier carácter de control.
[:digit:]Dígitos numéricos [0-9]
[:graph:]Cualquier carácter visible (no espacios en blanco).
[:lower:]Minúsculas [a-z]
[:print:]Caracteres que no sean de control.
[:punct:]Caracteres de puntuación.
[:space:]Espacio en blanco.
[:upper:]Mayúsculas [A-Z]
[:xdigit:]  Dígitos hexadecimales [0-9 a-f A-F]
sed 's/[[:lower:]]/a/g' archivo.txt todas las letras minúsculas del archivo.txt serán remplazadas por la letra a
COMANDO AWK
Su sintaxis es de la forma:
awk /patrón/ {acción}
Lee la entrada un renglón a la vez, cada renglón se compara con cada patrón en orden; para cada padrón que concuerde con el renglón se efectúa la acción correspondiente. Si se omite la acción, la acción por defecto consiste en imprimir los renglones que concordaron con el patrón y si se omite el patrón, la parte de la acción se hace en cada renglón de entrada. awk divide cada renglón de entrada en campos, (por defecto) cada campo estará separado por espacios, llama a los campos $1, $2, ..$NF donde NF es una variable cuyo valor es igual al número de campos. Los patrones deben ir rodeados por caracteres / y puede contener dos patrones separados por una coma, en cuyo caso la acción se realizará para aquellas líneas comprendidas entre la primera aparición del primer patrón y la siguiente aparición del segundo patrón.
NR variable igual número de línea actual.
FILENAME nombre del archivo de la entrada.
-F especificamos que carácter queremos que tome como separador de campos.
BEGIN realiza acciones antes de procesar entrada por ejemplo: awk 'BEGIN {FS =":"}' el carácter separador será dos puntos :

awk '{print $1","}' pp agrega un coma (,) al final del primer campo.
# cat pp
      3 hola
      2 pepe
      2 mama
      1 www
      1 si
      1 no
# awk '{print $1","}' pp
3,
2,
2,
1,
1,
1,
awk '{print $0","}' pp agrega un coma (,) al final de cada línea.
awk '$1 ~ /1/' ppmuestra todas las líneas cuyo primer campo contenga la cadena 1.
awk '$2 ~ /a/' pp muestras todas las líneas cuyo segundo campo contenga la letra a
awk '$2 !~ /a/' pp busca todas las líneas cuyo segundo campo no contenga la letra a
awk '/pepe/' ejemplo.txt busca todas las líneas que contenga la cadena pepe es equivalente a ejecutar grep pepe ejemplo.txt
awk '/pepe/,/si/' ejemplo.txt busca todas las líneas existentes entre los patrones pepe y si
ifconfig | awk /192/ es equivalente a ejecutar ifconfig | grep 192
ifconfig | awk '/192./ {print $2}'| awk -F: '{print $2}' muestra la dirección IP (si esta empieza por 192.)
awk '{if(length($0) < 12) print}' pp muestra todas las lineas que contengan menos de 12 caracteres.
awk '$2 ~ /si/ {if(length($0) < 12) print}' archivo.txt muestra todas las líneas mayores a 12 caracteres, cuyo segundo campo contenga la cadena si.
awk '{ while(++i<=NF) printf (!a[$i]++) ? $i FS : ""; i=split("",a); print "" }' ejemplo2.txt elimina las columnas repetidas (consecutivas o no) en cada una de las filas del archivo ejemplo2.txt

awk '{ while(++i<=NF) printf (!a[$i]++) ? $i FS : "ñññ"; i=split("",a); print "" }' archivo.txt | grep -v "ñññ" > sinrepetir.txt remplaza donde haya una palabra que se repetida por ñññ esto nos permita luego hacer: grep -v "ññññ" para eliminar esas lineas (elimina las lineas que tienen palabras repetidas).
awk -v IGNORECASE=1 '$1 ~ /Bisuteria/' t2 similar a ejecutar grep -i "^bisuteria" t2
substr(s,m,n) produce la subcadena s que comienza en la posición m y mide n caracteres de largo, si n se omite la subcadena se extiende hasta el final de la línea.
awk '{if(length($0) > 72) print "línea", NR, "muy larga:", substr($0,1,60)}' pepe.txt si alguna de las lineas de pepe.txt contiene más de 72 caracteres desplegará mostrando: línea xxx muy larga: acá mostraría parte de la línea.
awk -F":" '{print $2}' establecemos que el carácter separador será dos puntos : lo cual es equivalente a ejecutar awk 'BEGIN {FS = ":" } {print $2}'


Nota: Recurada que el archivo debe estar en formato UNIX, para ello puedes usar: dos2unix -n pp-dos.txt pp-unix.txt




Fuente:

No hay comentarios.:

Publicar un comentario