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