You are on page 1of 4

El comando awk

Ejemplos sencillos.
Tres ejemplos que hacen lo mismo
cat /etc/passwd
awk '{ print }' /etc/passwd
awk '{ print $0 }' /etc/passwd
- Imprimir la primera columna, se especifica que el separador es ":"
awk -F':' '{ print $1 }' /etc/passwd

( -F':' indica que el separador es

: )
Para la instruccin anterior su similar con cut sera:
cut -d':' -f1 /etc/passwd
Podemos hacer uso de sort para ordenar el resultado
awk -F':' '{ print $1 }' /etc/passwd | sort
Tambin podemos hacer una bsqueda con grep
awk -F':' '{ print $1 }' /etc/passwd | root
Otro caso de bsqueda es como lo siguiente
awk '/pam|usr/' /etc/passwd (significa que busque las coincidencias para pa
m usr, para decir
se usa | )
El ejemplo de clase... sumar el tamao total de los archivos con extensin .sh
ls -l *.sh
-rw-rw-r--rw-rw-r--rw-rw-r--rw-rw-r--rw-rw-r--rw-rw-r--rw-rw-r--rw-rw-r--rw-rw-r-campo 1

1
1
1
1
1
1
1
1
1

jr
jr
jr
jr
jr
jr
jr
jr
jr
c3

jr
jr
jr
jr
jr
jr
jr
jr
jr

131
176
72
77
100
167
106
171
118
^

abr
abr
abr
abr
abr
abr
abr
abr
abr

20
12
25
20
18
18
20
25
11

14:53
15:38
13:09
15:40
17:22
17:02
15:23
14:37
14:20

ag.sh
a.sh
busca.sh
decl.sh
dobleexp.sh
if.sh
leearchivo.sh
sel.sh
vives.sh

|_____ este es el campo 5


Lo siguiente es pasar ese resultado al awk como sigue:
ls -l *.sh | awk '{total += $5} END {print total}'
1118
Como se observa se tiene un resultado de 1118 que es la suma del cam
po 5.
Entendamos la instruccin:
awk '{total += $5} END {print total}'
total+=$5 es como decir total = total + campo 5

el END nos indica que ya que termin de sumar todos los registros,
hasta entonces imprime el total
Si se fijan ya no se pone $total, porqu? pues es porque ese es el
nombre de la variable, no imprime palabras.
Existe un comando que es uniq, se emplea utilizando -c para que cuen
te el nmero de veces que aparece una palabra en un listado, otro es history, en l
est el historial de comandos que utilizamos, entonces, si escribimos:
history
El resultado es:
95
96
97
98
99
100
101
102
103
104
105

cat base.txt | grep jm


cat base.txt | grep jm | cut -d ":" -f 4
cat renombra.sh
. renombra.sh
ls
cd ..
ls
cd fotos
ls
. renombra.sh
cat base.txt | grep | cut -d ":" -f 4

Es una lista muy muy grande, si lo que escribo ahora es:


history | awk '{print $2}' | sort | uniq -c
El resultado es
43 awk
1 b=20
1 b=3
2 b=36
1 c=50
44 cat
15 cd
Es una lista acomodada alfabticamente con una cuenta de las veces q
ue se ha repetido un comando.
Entendamos el ejemplo:
history | awk '{print $2}' | sort | uniq -c
history indica que muestre todos los comandos utilizados
awk '{print $2}' que imprima la segunda columna solamente, para
el caso de "95 cat base.txt | grep jm" es cat
sort es para ordenar
uniq -c es para contar las veces que la palabra se repite, en es
te caso cat
Ahora bien, si lo que se desea es saber los 10 comandos mas util
izados, solo se agregan al final dos instrucciones
history | awk '{print $2}' | sort | uniq -c | sort -rn | head
Resultado:

135
59
44
43
42
27
23
17
15
14

echo
.
cat
awk
ls
let
sudo
nano
cd
who

qu fu lo que sucedi? bueno, primero, ya habamos acomodado por orden a


lfabtico con sort, luego contamos indicencias con uniq -c, lo que sigue es ordena
r pero por nmero, por eso utilizamos sort -n, head lo que hace es mostrar las die
z primeras lneas.
Para corroborar lo anterior pueden ejecutar primero history | aw
k '{print $2}' | sort | uniq -c | sort -rn y ver el resultado.
Pensemos un poco en el ejercicio de realizar un backup de x usuario. El campo 6
indica el home del usuario que se elija, por tanto, el script tendra que llevar a
lgo como lo que sigue:
rutadirectorio=$( awk -F':' '{print $6 }' /etc/passwd | grep $usuario)
Para saber si root est ejecutando el script podemos utilizar whoami ya que este c
omando regresa el usuario que est ejecutando la terminal.
Despus, si el usuario es root que realice un men de todos los usuarios, eso puede
ser con select. qu se ocupa?, bueno, podemos hacer uso de $(awk -F':' '{print $1
}' /etc/passwd) eso me dara la lista con todos los usuarios
Prueben el siguiente cdigo:
PS3="Elige un usuario: "
select usuario in $(awk -F':' '{print $1 }' /etc/passwd);
do
echo ok Elegiste $usuario
break
done

Eso permite elegir un usuario cualquiera. Lo anterior sirve para elegir ahora el
directorio, cmo?
directorio= $( cat /etc/passwd | grep $usuario | awk -F':' '{ print $6 }' )
Bueno, ya tenemos casi todo el programa, ya solo falta pedir la ruta donde guard
arlo y despus hacer el backup, cmo hago el backup?
Existe el comando tar,

Archivos .tar.gz:
Comprimir: tar -czvf empaquetado.tar.gz /carpeta/a/empaquetar/
Descomprimir: tar -xzvf archivo.tar.gz
Archivos .tar:
Empaquetar: tar -cvf paquete.tar /dir/a/comprimir/
Desempaquetar: tar -xvf paquete.tar
Archivos .gz:
Comprimir: gzip -9 index.php
Descomprimir: gzip -d index.php.gz
Archivos .zip:
Comprimir: zip archivo.zip carpeta
Descomprimir: unzip archivo.zip
Entonces, lo que hago es poner la instruccin:
tar -cvf respaldo.tar $rutabackup
y listo! cuando termine debe existir un archivo .tar en la carpeta seleccionada.
Lo interesante es que arreglen el script para que el nombre tenga la fecha y el
nombre del usuario. cmo?
nombrearchivo = $usuario
fecha=$(date +%d%m%y)
260416

<--- me d la fecha en formato de cadena, el resultado es


que es el 26 de abril de

l 2016
luego, ejecutamos
nombrearchivo+=_
en ese momento nombrearchivo vale por ejemplo usuario_
nombrearchivo+=$fecha
ahora nombrearchivo vale usuario_260416
despus nombrearchivo+=.tar
ahora nombrearchivo vale usuario_260416.tar
Y listo, ahora el backup tendr un nombre diferente.

You might also like