Herramientas de usuario

Herramientas del sitio


clase:daw:si:2eval:tema13

Diferencias

Muestra las diferencias entre dos versiones de la página.


clase:daw:si:2eval:tema13 [2025/11/03 11:37] (actual) – creado - editor externo 127.0.0.1
Línea 1: Línea 1:
 +====== 13. Scripts avanzados en Linux ======
 +En este temas vamos a ver usa serie de órdenes que se usan concatenadas usando una tubería ''|''.
 +
 +Mas información:
 +  * [[https://www.linuxadictos.com/tuberias-lo-que-necesitas-saber-para-empezar-a-usarlas-en-gnu-linux.html|Tuberías: lo que necesitas saber para empezar a usarlas en GNU/Linux]]
 +
 +
 +===== grep =====
 +
 +  * [[https://rm-rf.es/ejemplos-practicos-de-grep-y-egrep/|Ejemplos prácticos de grep y egrep]]
 +  * [[https://rm-rf.es/unix-expresiones-regulares/|Unix: Expresiones regulares]] 
 +  * [[http://systemadmin.es/2009/10/grep-con-expresiones-regulares|grep con expresiones regulares]]
 +
 +<sxh bash>
 +#Mostrar la linea del usuario root del fichero ''/etc/passwd''
 +cat /etc/passwd | grep -E "^root:" 
 +</sxh> 
 +<sxh bash>
 +#Filtrar los nombre de los ficheros
 +ls | grep -E "hola" 
 +</sxh> 
 +
 +  * Expresiones regulares
 +
 +^ Expresion ^ Significado ^ Ejemplo ^ Explicación Ejemplo ^
 +| ''^'' | Inicio de linea | ''^pepe'' | Que empiece con pepe
 +| ''$'' | Final de línea | ''juan$'' | Que acaba con juan
 +| ''[abc]'' | Algunos de los caracteres que hay dentro | ''[aeiou]'' | Que contenga alguna vocal |
 +| ''[a-z]'' | Algunos de los caracteres que hay dentro del rango | ''[a-z]'' | Que contenga alguna letra entre a letra "a" y la letra "z" |
 +| ''.'' | Cualquier caracter | ''p.p'' | Que tenga una p , cualquier cosa y otra p |
 +| ''[^a]'' | Que no sea al caracter de dentro | ''p[^a]p'' | Que tenga una p , que no sea una "a" y otra p |
 +| ''*'' | Que se repite de 0 a infinitas veces | ''pa*p'' | Que tenga una p , cero o infinitas "a" y otra p |
 +| ''+'' | Que se repite de 1 a infinitas veces | ''pa+p'' | Que tenga una p , 1 o infinitas "a" y otra p |
 +| ''{n,m}'' | Que se repite entre n y m veces | ''pa{3,10}p'' | Que tenga una p , entre 3 o 10 "a" y otra p |
 +| ''{n}'' | Que se repite entre n veces | ''pa{3}p'' | Que tenga una p , tres "a" y otra p |
 +| ''\s'' | El carácter de un separador, sea una espacio o un tabulador | ''p\sp'' | Que tenga una p , un espacio o un tabulador y otra p |
 +===== cut =====
 +
 +  * [[http://rm-rf.es/unix-uso-del-comando-cut/|Unix: Uso del comando cut]]
 +  * [[http://www.nexolinux.com/ejemplos-comando-cut/|Ejemplos comando CUT]]
 +
 +<sxh bash>
 +#Mostrar La 6º columna del fichero pero solo los que empiecen por "root".
 +cat /etc/passwd | grep "^root:" | cut -d ":" -f6
 +</sxh> 
 +
 +<sxh bash>
 +#Mostrar desde el 3º caracter hasta el 10º caracter del fichero pero solo los que empiecen por "root".
 +cat /etc/datos.txt | grep "^root:" | cut -c3-10
 +</sxh> 
 +
 +<sxh bash>
 +#Mostrar desde el 3º caracter hasta el final del fichero pero solo los que empiecen por "root".
 +cat /etc/datos.txt | grep "^root:" | cut -c3-
 +</sxh> 
 +
 +
 +===== wc =====
 +
 +  * [[https://hablemoslinux.wordpress.com/2012/02/26/el-comando-wc/|El comando wc]]
 +
 +<sxh bash>
 +#Contar el número de lineas del ''fichero''
 +cat fichero | wc -l
 +</sxh> 
 +
 +
 +<sxh bash>
 +#Contar el número de palabras del ''fichero''
 +cat fichero | wc -w
 +</sxh> 
 +
 +<sxh bash>
 +#Contar el número de bytes del ''fichero''
 +cat fichero | wc -c
 +</sxh> 
 +
 +<sxh bash>
 +#Contar el número de caracteres del ''fichero''
 +cat fichero | wc -m
 +</sxh> 
 +
 +
 +<note tip>
 +La diferencia entre contar bytes o caracteres es que en UTF-8 , a veces , un carácter son varios bytes.
 +
 +<sxh bash>
 +echo -n a | wc -c
 +1
 +echo -n á | wc -c
 +2
 +echo -n a | wc -m
 +1
 +echo -n á | wc -m
 +1
 +
 +</sxh> 
 +
 +</note>
 +===== head =====
 +Muestra las primeras lineas de un fichero. Por defecto son las 10 primeras.
 +
 +\\
 +
 +  * Mostrar solo las primeras 10 líneas de un fichero
 +<sxh bash>
 +cat fichero | head 
 +</sxh>
 +
 +\\
 +
 +  * Mostrar solo las primeras 13 líneas de un fichero
 +<sxh bash>
 +cat fichero | head -13
 +</sxh>
 +
 +\\
 +
 +===== tail =====
 +Muestra las últimas lineas de un fichero. Por defecto son las 10 últimas.
 +
 +\\
 +
 +  * Mostrar solo las últimas 10 líneas de un fichero
 +<sxh bash>
 +cat fichero | tail 
 +</sxh>
 +
 +\\
 +
 +  * Mostrar solo las últimas 13 líneas de un fichero
 +<sxh bash>
 +cat fichero | tail -13
 +</sxh>
 +
 +\\
 +
 +
 +
 +===== sed =====
 +
 +  * [[https://blog.carreralinux.com.ar/2016/07/usar-sed-modificar-contenido/|Reemplezar texto con sed]]
 +
 +<sxh bash>
 +#cambia hola por adios
 +cat fichero | sed 's/hola/adios/g' 
 +</sxh> 
 +<sxh bash>
 +#Borra la letra a
 +cat fichero | sed 's/a//g' 
 +</sxh>
 +
 +  * [[https://es.ccm.net/faq/3031-sed-eliminar-una-o-varias-lineas-de-un-fichero|Borrar lineas con sed]]
 +<sxh bash>
 +#Borra la primera línea
 +cat fichero | sed 1d 
 +</sxh>
 +<sxh bash>
 +#Borra las tres primeras líneas
 +cat fichero | sed 1,3d 
 +</sxh>
 +<sxh bash>
 +#Borra la última línea
 +cat fichero | sed '$d'
 +cat fichero | sed \$d
 +</sxh>
 +
 +
 +
 +
 +
 +===== Ejercicios =====
 +
 +==== Ejercicio 1 ====
 +Haz un Script llamado "home.sh" que tendrá como único parámetro el "login" de un usuario y mostrará por pantalla su carpeta ''home''.
 +
 +Para probar el Script crea los siguientes usuarios:
 +  * carlos
 +  * josecarlos
 +  * carlo
 +
 +
 +==== Ejercicio 2 ====
 +Haz un Script llamado "nombre_usuario.sh" que dado el "login" de un usuario muestre el texto:
 +  El nombre completo del usuario "pepe" es "Jose Cano" 
 +
 +
 +==== Ejercicio 3 ====
 +Haz un script llamado ''cache_cpu.sh'' que muestre el tamaño de la cache del procesador en MB y GB
 +
 +La información se obtendrá del fichero ''/proc/cpuinfo''
 +
 +
 +==== Ejercicio 4 ====
 +Haz un Script llamado "memoria.sh" que muestre lo siguiente por pantalla:
 +
 +  La memoria total del sistema es de 255908 kB
 +  La memoria libre del sistema es de  69936 kB
 +  
 +Y ahora modificalo par que salga en MB
 +
 +  La memoria total del sistema es de 255 MB
 +  La memoria libre del sistema es de  69 MB
 +
 +==== Ejercicio 5 ====
 +Haz un script llamado "numusers.sh" que muestre por pantalla el número de usuarios del sistema
 +
 +
 +==== Ejercicio 6 ====
 +Haz un Script que muestre el siguiente mensaje:
 +
 +  El numero de procesos del sistema es 42
 +  
 +Cambiando obviamente el 42 por el Nº **EXACTO** de procesos del sistema.
 +
 +
 + 
 +==== Ejercicio 7 ====
 +Haz un Script llamado "process_info.sh" que dado el pid de un proceso muestre **únicamente** el comando que lanzó el proceso de ese pid
 +
 +==== Ejercicio 8 ====
 +Haz un Script llamado "pcpu.sh" que dado el PID de un proceso muestre el siguiente texto:
 +  El % de uso del proceso con PID 3456 es 45
 +Sabiendo que para mostrar el % de uso de CPU en la lista de procesos se usa //pcpu//. Y obviamente se substituye el 3456 por el PID que se pasa como parámetro y el 45 por el % de uso real de la CPU de ese proceso.
 +
 +
 +==== Ejercicio 9 ====
 +Haz un Script que dado un PID de un proceso:
 +
 +Si la prioridad (nice) es menor que 0 que muestre:
 +  Prioridad alta
 +Si la prioridad (nice) es 0 que muestre
 +  Prioridad normal
 +Si la prioridad (nice) es mayor que 0 que muestre:
 +  Prioridad baja
 +
 +Deberás validar que se le pasa un argumento al script.
 +
 +==== Ejercicio 10 ====
 +Haz un Script llamado "info.sh" 
 +
 +Tendrá un único parámetro que deberá valer alguno de los siguientes:
 +  * ''TAMANYO_MEMORIA_RAM'': el programa deberá mostrar el tamaño de la RAM en MB
 +  * ''TAMANYO_MEMORIA_LIBRE_RAM'': el programa deberá mostrar la cantidad de memoria libre de la RAM en MB
 +  * ''TAMANYO_CACHE_CPU'':  el programa deberá mostrar el tamaño de la cache de la CPU en MB
 +
 +
 +Deberás validar que se le pasa un argumento al script.
 +
 +==== Ejercicio 11 ====
 +Haz un Script llamado "crear_home.sh" que dado el login de un usuario busque  cual es su carpeta home y:
 +  * Cree sea carpeta
 +  * Que ese usuario tenga permisos sobre esa carpeta
 +
 +Deberás validar que se le pasa un argumento al script.
 +
 +
 +==== Ejercicio 12 ====
 +Modifica el ejercicio anterior para añadir un segundo parámetro optativo que sea "KB", si está este segundo parámetro, la información de mostrará en "KB"
 +
 +
 +==== Ejercicio 13 ====
 +Haz un Script llamado "grupo_usuario.sh" que dado el "id" de un usuario muestre el nombre de su grupo principal
 +
 +
 +Deberás validar que se le pasa un argumento al script.
 +
 +
 +==== Ejercicio 14 ====
 +Dado un fichero llamado ''facturas.txt'' con el siguiente formato:
 +
 +  NumFactura,fecha_factura,base_imponible,iva,loginCliente
 +  1,2019/09/01,1300,21,cdiaz
 +  2,2018/03/21,700,13,jcano
 +  3,2020/01/15,700,21,vperez
 +
 +Y suponiendo que en linux existen los usuarios a los que hace referencia ''facturas.txt''
 +
 +Crea un script llamado "info_facturas.sh" que haga lo siguiente:
 +  * El primer parámetro siempre será el número de la factura
 +  * El segundo parámetro puede valer alguno de los siguientes
 +    * ANYO_FACTURA : Mostrará el año de la factura
 +    * BASE_IMPONIBLE: Mostrará el valor de la base imponible
 +    * IMPORTE_TOTAL: Mostrará el valor de la base imponible mas el % de IVA de la base imponible.
 +    * NOMBRE: Mostrará el nombre completo del cliente. El nombre se debe sacar del fichero ''/etc/passwd''
 +
 +Deberás validar que se le pasan 2 argumentos al script y que el segundo de ello tiene un valor válido.
 +  
 +==== Ejercicio 15 (OPTATIVO) ====
 +Servidor web con la calidad del aire de la ciudad
 +
 +Se va a crear un servidor web que muestre en tiempo real la calidad del aire de la ciudad
 +
 +Para ver la gŕafica se usará el programa "GNU Plot". Se puede ver un ejemplo es [[https://blog.mague.com/?p=201|Plotting Time Series Data with Gnuplot]]
 +
 +  * La máquina virtual debe tener la red en "adaptador puente"
 +  * Instalar el paquete plaquete: gnuplot-nox
 +  * Crear la carpeta www
 +  * Crear un fichero llamado "index.html" que muestre una imagen llamada "ozono.png"
 +  * Iniciar el servidor web con la orden
 +<sxh bash>
 +sudo python3 -m http.server 80 &
 +</sxh>
 +  * Crea un fichero llamado "ozono.gnuplot" para generar la imagen con gnuplot
 +  * Haz un Script llamado "calidad_aire.sh" que genere una imagen llamada "ozono.png" mediante los datos reales de contaminación de la Avd de Francia.
 +    * Descargar los datos de la estación de ozono atmosférica de Avda. Francia: [[http://gobiernoabierto.valencia.es/es/data/?groups=medio-ambiente|Portal Transparencia y Datos Abiertos Valencia: Medio ambiente]]. Se usa la orden ''wget''
 +    * Genera el fichero con los datos de las fechas y el ozono
 +    * generar la imagen "ozono.gnuplot"
 +  * Desde Windows navega al servidor y veras los datos
 +
 +==== Ejercicio 16 (OPTATIVO)  ====
 +Modifica el ejercicio anterior para mostrar también la gráfica del Óxidos de nitrógeno (NOx) y dióxido de nitrógeno  (NO<sub>2</sub>)
 +  
 +{{:clase:daw:si:2eval:calida_aire.png?600|}}
 +
 +==== Ejercicio 17 (OPTATIVO)  ====
 +Haz un Script, llamado calida_aire_png.sh que generará la gráfica de un parámetro de la calidad del aire.
 +La gráfica debe mostrar el nombre de la zona, lo que está mostrando y las unidades. (tal y como hemos visto en las anteriores gráficas)
 +Acepte como argumentos:
 +  * La zona de donde se en los datos
 +    * 1 para Universidad Politécnica
 +    * 3 para Molí del Sol
 +    * 4 para Pista de silla
 +    * 5 para Viveros
 +    * 6 para Avenida de Francia
 +    * 7 para Viveros
 +  * El tipo de medida que deseas mostrar en la gráfica.
 +    * SO2
 +    * As
 +    * BaP
 +    * Benceno
 +    * Cd
 +    * CO
 +    * Ni
 +    * NO
 +    * NO2
 +    * NOx
 +    * Ozono
 +    * Pb
 +    * Pb
 +    * PM1
 +    * PM10
 +    * PM2,5
 +    * Ruido
 +    * SO2
 +    * SO2
 +    * Tolueno
 +    * Veloc.
 +    * Xileno
 +  * El último parámetro será el nombre del fichero a generar
 +
 +Transformar a utf-8:
 +<sxh bash>
 +iconv -f ISO-8859-1 -t UTF-8 f1.txt > f2.txt
 +</sxh>
 +
 +Borrar la primera linea
 +<sxh bash>
 +cat f1.txt | sed 1d > f2.txt
 +</sxh>
 +
 +Generar un fichero a partir de Variables:
 +<sxh bash>
 +eval "echo \"$(cat file.template)\"" > file.txt
 +</sxh>
 +
 +
 +