ejercicios de shellresueltos
TRANSCRIPT
EJERCICIOS DE SHELL-SCRIPTS RESUELTOS LA MAYORÍA.
1.- Escribir un Shell-script llamado tabla que pida un número por teclado (del 1 al 10) y muestre su tabla de multiplicar de ese número, según el siguiente formato:
Tabla a repasar: 44x1=44x2=84x3=12, etc
#!/bin/bashecho “Introduzca un nº(entre 1 y 10):read numi=1while [ $i –le 10 ]do
echo “$num x $i = ”`expr $num “*” $i`done
2.- Escribir un shell-script denominado fileodir que compruebe que el parámetro que se le ha pasado es un fichero y en caso afirmativo muestre su contenido. Si el parámetro es un directorio deberá mostrar los ficheros que contiene. También, debe aceptar más de un parámetro.
#!/bin/bashfor i in $*do
if [ -f $i ]then
cat $ielif [ -d $i ]then
cd $ils –al
fidone
3.- Escribir un shell-script llamado sesion que se ejecute en segundo plano y finalice su ejecución cuando exista más de dos sesiones abiertas en el sistema por el usuario que se pase como parámetro. Al finalizar el script, éste deberá mandar un mensaje a todas las consolas y terminales donde root inició una sesión con el siguiente mensaje:
“El usuario <user> acaba de iniciar una sesión en el sistema”
donde <user> es el usuario pasado como parámetro#!/bin/bash
1
if [ ps -e4.- Escribir un shell-script llamado datos, al que se le pase un archivo de texto desde la línea de comandos y una opción. Si el archivo no existe lo crea conteniendo la fecha actual y el login (nombre de inicio de sesión) del usuario que ejecuta el script con los siguientes permisos rw- r-rw. Si el archivo existe, mostrará un mensaje según una de las siguientes opciones:./datos [opción] archivo.txt
-n: el número de lineas del archivoEj: archivo.txt (24 líneas)
-p: los permisos del archivoEj: archivo.txt permiso: -rwx r- r-
-t: el contenido del archivo ordenado
Si el archivo no existe, deberá mostrar un mensaje por Ej: El archivo < archivo.txt> no existe
donde archivo.txt es el archivo pasado como parámetroNota: Se supone que el archivo debe estar en el directorio home del usuario
5.- Dado el siguiente archivo personas.txt Ana;Perrrrrrrales;1000Pedro;Soria;1600Jacinto;Manzano;500Claudia;Pastor;600Xavier;Granados;1000Soraya;Annnnnnnneja;3000Xavier;Guerra;4500Sara;Siria;675Pablo;Serrano;1000Sonia;Mono;1600
a.- Guarda en el fichero personas2.txt las personas cuyo nombre empiece por J y S.grep "^J" personas.txt > personas2.txtgrep "^S" personas.txt >> personas2.txtb.- Quita aquellas personas cuyos nombres no empiezan por S y cópialas en un archivo denominado personas3.txtgrep -v "^S" personas.txt > personas3.txtgrep ^[^S] personas.txt > personas3.txtc.- Ordena las personas por su sueldosort -n -t\; -k3 personas.txtd.- Ordena las personas por el tercer carácter de su apellidosort -t\; -k2.3 personas.txte.- Muestra ordenada las personas que cobran 1000 euros.
2
grep 1000 personas.txt | sortf.- Indica cuántas personas comienza su apellido por S.cut -d\; -f2 personas.txt | grep "^S" | wc -lg.- Borra las letras que sean repetidastr -s [A-Z] < personas.txt | tr -s [a-z]h.- Sustituye los nombres llamados Xavier por Javier.sed 's/Xavier/Javier/' personas.txti.- Guarda en un archivo llamado personas4.txt desde la 4ª hasta la 8ª persona.head -n8 personas.txt | tail –n5>personas4.txt # 4,5,6,7,8. 5 en totalj.- Los sueldos de 1000 euros han aumentado a 1200. Cámbialos.sed 's/1000/1200/g' personas.txtk- Buscar todos los archivos que hay en el directorio actual y en sus subdirectorios con extensión .txt y tienen permisos de lectura y escritura.find . -name "*.txt" -perm /u+rw,g+rw,o+rwfind . -name "*.txt" -perm 666l.- -Cuenta el número de ficheros y directorios que existen en el home (directorio personal) del usuario.find $HOME -type d | wc -lfind $HOME -type f | wc -lfind $HOME -maxdepth 1 -type d | wc -lfind $HOME -maxdepth 1 -type f | wc -lm.- Borra los ficheros que comiencen con p en el directorio actual y en todos sus subdirectorios find -name "p*" -exec rm {} \;n.- Mueve los ficheros que contienen en su nombre el texto mp3 al home del usuario.find -name "*mp3*" -exec mv {} $HOME \;o.- Quita los blancos de los nombres de los ficheros del directorio home. dado un directorio como parámetrofind $HOME -name "*.txt" | tr -d " "find $HOME -name "*.txt" | sed 's/ //'6.- Escribir un Shell-script llamado copia que reciba un directorio como primer parámetro, y a continuación una lista de ficheros. El script debe validar que los parámetros recibidos sean realmente ficheros y luego copiarlos al directorio recibido. Además debe comprobar que exista el fichero original y no la copia.#!/bin/bashif [ -d $1 ] # si es directorio then
for i in $*do
3
if [ -f $i ]then
cp $i $1else
echo “$i no es un fichero”fi
doneelse #si el primer parám. no es directorio, error
echo “$1 no es un directorio”fi7.- Escribir un Shell-Script llamado lectura que genera un fichero llamado listaficheros que contenga los ficheros con permiso de lectura que haya en un directorio pasado como parámetro. El nombre del fichero debe incluir en su nombre la fecha y la hora, es decir listaficheros09-11-2010-18:00#!/bin/bashif [ -d $1 ]then
echo “lista de ficheros del directorio $1”>listaficheros$(date +%d-%m-%Y-%H:%M) for i in $1/*
dols –al $i>>listaficheros$(date +%d-%m-%Y-%H:%M)
doneelse
echo “$1 no es un directorio”fi8.- Escribir un Shell-Script llamado busca que, partiendo del fichero generado en el ejercicio anterior, muestre todos los ficheros que contengan una palabra pasada como parámetro.#!/bin/bashcat listaficheros*|grep $1 ]
4
9.- Escribir un Shell-script llamado cuenta que cuente cuántos ficheros y cuántos directorios hay en el directorio pasado como argumento#!/bin/bashif [ -d $1 ]then
directorios=0ficheros=0for i in $1/*do
if [ -d $i ]then
directorios=`expr $directorios “+” 1`else
ficheros=`expr $ficheros “+” 1`fi
doneecho “ficheros= $ficheros”echo “directories= $directorios”
elseecho “$1 no es ningún directorio”
fi
10.- Escribir un Shell-Script llamado lineas que muestre el fichero del directorio pasado como parámetro con más líneas.#!/bin/bashif [ -d $1 ]then
linMuestra=0linActual=$linMuestrafichero=””for i in $1/*do
if [ -f $i -a -r $i ]then
linActual=`wc -l $i |awk '{print $1}'`
if [ $linActual -gt $linMuestra ]then
linMuestra=$linActualfichero=$i
fifi
done
5
echo "el fichero con más líneas es $fichero y tiene $linMuestra líneas" else
echo "$1 no es ningún directorio”fi11.- Escribir un Shell-Script llamado compara que compare dos archivos (que se reciben como parámetro) y diga por pantalla cuál de ellos tiene mayor cantidad de líneas.#!/bin/bashif [ $# -eq 2 -a -f $1 -a -f $2 ]then
echo $1echo $2primero=`wc -l $1 |tr -s " " |cut -d" " -f1`segundo=`wc -l $2 |tr -s " " |cut -d" " -f1`echo $primeroecho $segundoif [ $primero -gt $segundo ]then
echo “$1 tiene más líneas que $2”else
echo “$2 tiene más líneas que $1”fi
elseecho "./compara.sh archivo1 archivo2”
fi 12.- Crea un shell script que calcule la media de todos los números recibidos como parámetro.
Nota: Comprobar que los parámetros son números. #!/bin/bashtotal=0for i in $*do
variable=`echo $i |grep –e [:alpha:]` if [ “$variable” = “” ]
then total=`expr $total “+” $i`
elseecho “$i no es numérico”
fidonemedia=`expr Stotal \/ $#`echo “La media es $media”13.- Crea un script que reciba un directorio como primer parámetro, y a continuación una lista de archivos. El script debe validar que los
6
parámetros recibidos sean realmente archivos (y que existen) y luego copiarlos al directorio recibido.
14.- Desarrolla un script que reciba como parámetro un directorio. Verificar que el mismo existe y devolver la suma de los tamaños de todos los archivos (en kilobytes) que se encuentran en ese directorio.#!/bin/bashif [-d $1 ]then
tamanos=`ls -l $1 | tr -s " " | cut -d" " -f5` //tamanos: lista tamaño archivos
total=0 //total: suma tamañosfor i in $tamanosdo
total=`expr total + $i`donetotalkb=`expr total / 1024`echo $totalkb
fi
15.- Realizar un script que espere hasta que un determinado proceso se ejecute, y cuando este proceso se ejecuta, matarlo. Cuando ocurra tal evento, deberá mandar un mensaje a root informando de tal evento.Nota: No se puede usar el comando killall.#!/bin/bashif [ $# -eq 1 ]then
while [ 1 ]do
proceso=`ps -e | grep $1 | tr -s " " | cut -d" " -f2` //busca proceso
if [ $? -eq 0 ]then
kill -9 $proceso nombre_proceso=`ps -e | grep $1 | tr
-s " " | cut -d" " -f5`echo "$nombre_proceso:$proceso:`date
+%D`:`date +%R`" >> /var/log/mata.logfi
donefi
16.- Realizar un Shell-script que realice una copia de seguridad de los directorios /etc, y /var. La copia de seguridad se denominará backup-mes-día-año.tar.gz y se almacenará en un dispositivo removible (por ejemplo un pendrive o memorystick)
7
Este script se deberá ejecutar todos los días a partir de las 12 de la noche (la mejor hora para realizar las copias).Por ejemplo, si realizaras la copia de seguridad el 7 de diciembre, se denominaría backup-07-12-10.tar.gz Nota: Para montar y desmontar dispositivos removibles deberás ejecutar el siguiente comando:
mount -t vfat /dev/sdb1 /media/diskumount /media/disk
17.- Realizar un Shell-script que muestre la información sobre las cuentas de usuario que contiene un fichero pasado como argumento. Las filas del fichero contendrán un nombre en cada fila. En el caso de que una cuenta de usuario no exista, deberá mostrar un mensaje de error y su directorio personal. La información se almacenará en un archivo con el siguiente formato:
login:nombre_grupo:directorio_personal:shell
Por Ejemplo: Si el usuario fuera JRGonzalez, está incluido en el grupo de los contables, su directorio personal es /home/JRGonzalez y su shell /bin/bash, deberá mostrar el siguiente mensaje.
JRGonzalez:contables:/home/JRGonzalez:/bin/bashNota: Los ficheros con los que tienes que trabajar para desarrollar este script son /etc/passwd (usuarios del sistema) y /etc/group (grupos del sistema).
8