Skip to content

PER

patrons expresio regular

Regular expresion --> regex

grep "per" file[...] buscar/filtrar lineas mediante un patron

^    # principio dev linea
$    # final de linea
[]      # lista que contenga [aei] a,e,i
[0-9a-Z] # rangos
[^]    # lista que no contenga
.    # un caracter
 *    # junto al caracter anterior 0 o n veces 
.*    # 0 o cualquier caracter
{}    # numero de repeticiones {n}{n,m}{n,}{,n}
?    # reperticion del caracter anterior cero o una vez
+    # reperticion del caracter anterior una o mas veces
[:alnum:], [:alpha:], [:cntrl:], [:digit:],  [:graph:],  [:lower:],  [:print:],
       [:punct:],  [:space:],  [:upper:],  and  [:xdigit:].   For  example,  [[:alnum:]]
echo "hola hole holi" | grep  "hol[^ae]"
holi holi

echo "hola hole holi holiesto" | grep  "hol[^ae]."
holi holie

echo "hola hole holi holiesto" | grep  "hol[^ae]*"
hol hol holi holie

echo "hola hole holi holiesto" | grep  "hol[^ae].*"
holi holiesto

echo "hola hole holi holiesto" | grep  ".*holi"
hola hole holi holi

El * busca lo mas a la derecha posible

echo "aa:cc:bb:cc:dd" | grep ".*:cc:"
aa:cc:bb:cc:
grep 
-i ignore case ( ignorarv casec sensitive )
-v invert match ( revertir busquerda )
-n numero de lineas
-E aceptar expresiones regulares {}, |, [], etc... o egrep

Buscando coincidencias con grep tenemos que acotar bien, indicando principios, finales etc.. ^[^:]* : Buscar desde el principio hasta el primer :

 echo "a:b:c:d:b:y:" | grep "^[^:]*:b:"
a:b:
# busqueda del 3er campo 
 grep "^[^:]*:[^:]*:1:" passwd
bin:x:1:

Linea del /etc/passwd

  • login:passwd:uid:gid:gecos:home:shell
  • gecos: descripcion

Validar matriculas actuales y antiguas.

9999 AAA
A[A]-9999-AA
format1="^[0-9]{4} [A-Z]{3}$" 
format2="^[A-Z][A-Z]?-[0-9]{4}-[A-Z]{2}$"
grep -E "$format1|$format2" matriculas

CUT

Cut muestra sólo una parte de cada linea. hace un corte en vertical

-c recorta teniendo en cuenta caracteres y -f tiene en cuenta columnas , por defecto cut delimita ppor tabuladores pero con -d se puede modificar

cut -c 1,2 /etc/passwd # muestra el caracter 1 y 2 de todas las lineas
cut -c -3 /etc/passwd   # mestra del  primer caracter al tercero
cut -c 2- /etc/passwd   # mestra del segundo al final de linea
cut -c 2-4 /etc/passwd  # muestra del segundo al cuarto caracter

# muestra fila 1 y 2 delimitando las filas por :
cut -d":" -f 1,2

TR

tr sustitulle letras, en sus filtros también acepta caracteres especiales como \t o clases.

tr "" ""
 que y porqué
substitución de cada letra por letra no sirve para palabras

➜ echo "casa" | tr "a" "e"
cese

➜ echo "casa" | tr -d "a" 
cs

➜ echo "caaasaaaa" | tr -s "a" 
casa

➜ echo "Mi    casa    tiene 10 lamparas" | tr -s "[:blank:]" " "
Mi casa tiene 10 lamparas

➜ echo "Mi casa tiene 10 lamparas" | tr "[:alpha:]" "X"
XX XXXX XXXXX 10 XXXXXXXX

➜ echo "Mi casa tiene 10 lamparas" | tr "[:digit:]" "X"
Mi casa tiene XX lamparas

echo "la mar estaba salada, merda" | tr "mar" "cel"
le cel estebe selede, celde
  • En el anterior caso visualmente funciona mal, pero realment sustituye por letra. m => c, a=>e y la r=>l.

  • En el caso de querer substituir palabras se tiene que utilizar otros comandos como, sed, awk, etc..

Tipos de clases: representan un conjunto predefinido de caracteres

clases descripcion
[:alnum:] Las letras y Dígitos
[:alpha:] Letras
[:blank:] Espacios en Blanco
[:cntrl:] Caracteres de control
[:space:] Los Espacios en Blanco verticales y horizontales
[:graph:] Caracteres imprimibles, sin incluir el Espacio en Blanco
[:print:] Caracteres imprimibles, incluyendo el Espacio en Blanco
[:digit:] Dígitos
[:lower:] Letras minúsculas.
[:upper:] Letras mayúsculas.
[:punct:] Signos de puntuación.
[:xdigit:] DígitosHexadecimales.

Blank

blank son espacios. tabulador un espcio en blanco sin dfefinir en anchura. cuando el delimitador es un blanco se a de normalizar.

Ejemplo de normalizar la salida de fstab, creo separadores para poder filtrar por columnas facilmente. ( El delimitador no puede estar en el contenido por defecto (un blanco o un tabulador) )

En el siguiente ejemplo se ve la salida de fstab, pero no sabemos cuantos espacios o tabuladores hay entre campo y campo. De esta manera resulta imposible crear una salida en condiciones, por lo tanto la normalizo a un blanco único entre campos.

grep -v "^#" fstab
/dev/sda5         /                ext4 defaults        1   1
/dev/sda7 swap                    swap    defaults        0 0

grep -v "^#" fstab | tr -s "[:blank:]" " "
/dev/sda5 / ext4 defaults 1 1
/dev/sda7 swap swap defaults 0 0
  • -s ,--squeeze-repeats

SORT

sort -n -t: -k3,3 passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
  • -n Ordena numericamente
  • -k Ordena por campo
  • -k3 campo 3 hasta final de la línea
  • -k3,3 especificamente campo 3
  • -k3n,3 campo 3 ordenado numericamente
  • -t delimitador entre campos

Ordenar campo 4 orden descendente numericamente

passwd |  sort  -t: -k4rn,4
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

Ordenación --> estable ( propiedad ) En ordenaciones siempre a de ver un campo clave, esto significa que si filtras por un campo en el que puede aber resultados iguales, se tiene que filtrar por un segundo o mas campos.

ll / | head | tr -s "[:blank:]" ' ' | cut -d" " -f2,3,5,6 | sort -t' ' -k3n,3 -k1n,1

18 root 3,3K ene
2 root 4,0K ene
2 root 4,0K ene
3 root 4,0K ene
5 root 4,0K ene
19 root 4,0K ene
162 root 12K ene
1 root 30 ene
1 root 30 ene
  • Normalizo la salida con tr

  • recorto las filas que me interesan con cut

  • Ordeno numericamente, ascendente, por la columna 3 y los que coinciden por la 1

SED

Sintaxis

sed <seleccio de linies> 's/<que busco>/<por que cambio>/<numero de veces>'
 echo "hola mama que tal" | sed 's/mama/papa/'
hola papa que tal
# sustituir una vez
sed 's/mama/papa/'

# sustituir recursivamente
sed 's/mama/papa/g'

# desde la linea 3 hasta el final  
sed '3,$ s/bin/BIN/g' text

# desde linea 1 hasta 7 incluida
sed '1,7 s/bin/BIN/g' text

# sustitulle en las lineas que contengan elfo bin por BIN
sed '/elfo/ s/bin/BIN/g' text

# desde la linea que contenga capitulo 1 hasta capitulo 2 sustitulle bin por BIN
sed '/capitulo 1/,/capitulo 2/ s/bin/BIN/g' text

# desde la linea que contenga  capitulo 2 hasta el final
sed '/capitulo 2/,$ s/bin/BIN/g' text

Sed con expresiones

# dejar linea 3 en blanco
sed '3 /^.*$//g'

# eliminar el primer campo
echo "Nom:Cognom:Adreça:email"  | sed 's/^[^:]*://g'  
Cognom:Adreça:email

# Reordenar primer y segundo campo. "\1 y \2" se refiere a parentesi 1 y 2
echo "Nom:Cognom:Adreça:email"  | sed -r 's/^([^:]*):([^:]*):/\2:\1:/g'  
Cognom:Nom:Adreça:email

# eliminar un campo y redistribuir los otros.
echo "Nom:Grup:Nota"  | sed -r 's/^([^:]*):([^:]*):(.*)$/\3--\1/g'   
Nota--Nom

# modificar un valor. "&" se refiere al contenido a substituir
echo "Nom:Grup:Nota"  | sed -r 's/Grup/ASI-&/g'  
Nom:ASI-Grup:Nota

# utilizando variables 
NOMBRE="Jorge"
echo "Nom:Grup:Nota"  | sed -r "s/Nom/$NOMBRE/g"  
Jorge:Grup:Nota

# poner separador de millares
echo "45200"  | sed -r "s/[0-9]{3}$/.&/g"   
45.200

paste

paste concatena linea a linea la informacion de dos ficheros

 cat notas 
1
2
5
9 cat nombres 
juan
anna
pedro
lucia

➜ paste nombres notas 
juan    1
anna    2
pedro   5
lucia   9

JOIN

Join relaciona dos ficheros según un campo.

archivos base.

cat adats.txt
pere 12
marta 25
juan 10

cat notes.txt
pere 6
marta 10
juan 8.5
lluis 4

Hay que tener en cuenta que el primer archivo se indica como -1 y el segundo archivo -2

# relacion automatica
join adats.txt notes.txt 
pere 12 6
marta 25 10
juan 10 8.5

# Relacionar por campo 1 del archivo 1
join -1 1 adats.txt notes.txt
pere 12 6
marta 25 10
juan 10 8.5

# relacionar por campo 1 del archivo 1 y 2
join -1 1 -2 1 adats.txt notes.txt
pere 12 6
marta 25 10
juan 10 8.5

# idem anteror + mostrar salida archivo 2 campo 2
join -o2.2  -1 1 -2 1 adats.txt notes.txt
6
10
8.5

# idem anterior + salida campo 1 del archivo 1
join -o2.2,1.1  -1 1 -2 1 adats.txt notes.txt
6 pere
10 marta
8.5 juan
- -o se creiere a output, que quiees mostrar y de donde.

Left y right join. indicamos left join con -a 1 y right join con -a 2.

# left join
join -a 1 -o2.2,1.1  -1 1 -2 1 adats.txt notes.txt
6 pere
10 marta
8.5 juan

# right join
join -a 2 -o2.2,1.1  -1 1 -2 1 adats.txt notes.txt
6 pere
10 marta
8.5 juan
4 

Chattr

Protegemos nuestros archivos de un posible borrado chattr, con este comando no podremos borrar dicho archivo o carpeta ni siendo root.

Al protegerlo no nos dejará crear clonaciones tipo hard, solo accesos directos tipo Soft aunque no podremos editarlo de ninguna manera.

Proteger

sudo chattr +i <archivo/carpeta>

Liberar

sudo chattr +i <archivo/carpeta>