====== 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]] #Mostrar la linea del usuario root del fichero ''/etc/passwd'' cat /etc/passwd | grep -E "^root:" #Filtrar los nombre de los ficheros ls | grep -E "hola" * 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]] #Mostrar La 6º columna del fichero pero solo los que empiecen por "root". cat /etc/passwd | grep "^root:" | cut -d ":" -f6 #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 #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- ===== wc ===== * [[https://hablemoslinux.wordpress.com/2012/02/26/el-comando-wc/|El comando wc]] #Contar el número de lineas del ''fichero'' cat fichero | wc -l #Contar el número de palabras del ''fichero'' cat fichero | wc -w #Contar el número de bytes del ''fichero'' cat fichero | wc -c #Contar el número de caracteres del ''fichero'' cat fichero | wc -m La diferencia entre contar bytes o caracteres es que en UTF-8 , a veces , un carácter son varios bytes. echo -n a | wc -c 1 echo -n á | wc -c 2 echo -n a | wc -m 1 echo -n á | wc -m 1 ===== head ===== Muestra las primeras lineas de un fichero. Por defecto son las 10 primeras. \\ * Mostrar solo las primeras 10 líneas de un fichero cat fichero | head \\ * Mostrar solo las primeras 13 líneas de un fichero cat fichero | head -13 \\ ===== tail ===== Muestra las últimas lineas de un fichero. Por defecto son las 10 últimas. \\ * Mostrar solo las últimas 10 líneas de un fichero cat fichero | tail \\ * Mostrar solo las últimas 13 líneas de un fichero cat fichero | tail -13 \\ ===== sed ===== * [[https://blog.carreralinux.com.ar/2016/07/usar-sed-modificar-contenido/|Reemplezar texto con sed]] #cambia hola por adios cat fichero | sed 's/hola/adios/g' #Borra la letra a cat fichero | sed 's/a//g' * [[https://es.ccm.net/faq/3031-sed-eliminar-una-o-varias-lineas-de-un-fichero|Borrar lineas con sed]] #Borra la primera línea cat fichero | sed 1d #Borra las tres primeras líneas cat fichero | sed 1,3d #Borra la última línea cat fichero | sed '$d' cat fichero | sed \$d ===== 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 sudo python3 -m http.server 80 & * 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 (NO2) {{: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: iconv -f ISO-8859-1 -t UTF-8 f1.txt > f2.txt Borrar la primera linea cat f1.txt | sed 1d > f2.txt Generar un fichero a partir de Variables: eval "echo \"$(cat file.template)\"" > file.txt