
Paso de un ejercicio de shell script a awk
Publicado por Alejandro (2 intervenciones) el 11/03/2014 11:40:45
Hola, me gustaría saber si me podíais echar una mano con el 2º ejercicio:
EJERCICIO 1
El comando ps empleado con las opciones –awxl vuelca a la salida estándar, separando por varios espacios, diversa información de todos los procesos del sistema operativo (consultar el manual en línea para identificar dicha información):
Sin utilizar awk, realizar un shell-script lista_procesos_usuarios que, basándose en el comando ps anterior, muestre para cada una de los UIDs pasados como argumento del script, los procesos pertenecientes al UID correspondiente, por orden de PID de menor a mayor. En la salida deberán aparecer únicamente el UID, PID, PPID y COMMAND de cada proceso. Por ejemplo:
$prompt> ./lista_procesos_usuarios 0 500
Usuario 0:
UID PID PPID COMMAND
0 1 0 init[2]
0 2 0 [kthreadd]
0 3 2 [migration/0]
...
NOTA1: La salida del Shell-script debe tener exactamente el mismo formato que el mostrado arriba.
Consejo: Para poder procesar correctamente el comando ps y quedarse con la información que se necesita se recomienda pasar la salida de dicho comando por el comando tr –s " " que nos permitirá obtener a la salida todos los campos del ps separados por un único espacio en blanco. Por ejemplo:
$prompt> ps awxl | tr –s " "
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
SOLUCIÓN AL EJERCICIO 1
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
EJERCICIO 2
Realizar, utilizando AWK, el mismo Shell-script que el problema 1 pero mostrando de cada usuario únicamente los procesos con VSZ mayor o igual que la cantidad indicada en el primer parámetro del Shell-script. Por ejemplo:
$prompt> ./lista_procesos_usuarios 4096 0 500
NOTA1: La salida del Shell-script debe tener exactamente mismo formato que el mostrado en el problema 1.
NOTA2: Es obligatorio que el programa AWK esté implementado en un fichero propio y aparte del Shell- script llamado lista_procesos_usuarios.awk
Consejo: Para poder procesar correctamente el comando ls con el AWK se recomienda pasar la salida de dicho comando por el comando tr –s " " que nos permitirá obtener a la salida todos los campos del ls separados por un único espacio en blanco. Por ejemplo:
$prompt> ps awxl | tr –s " "
Mi duda, es como pasarlo a awk, e incorporar lo de VSZ.
Gracias.
EJERCICIO 1
El comando ps empleado con las opciones –awxl vuelca a la salida estándar, separando por varios espacios, diversa información de todos los procesos del sistema operativo (consultar el manual en línea para identificar dicha información):
Sin utilizar awk, realizar un shell-script lista_procesos_usuarios que, basándose en el comando ps anterior, muestre para cada una de los UIDs pasados como argumento del script, los procesos pertenecientes al UID correspondiente, por orden de PID de menor a mayor. En la salida deberán aparecer únicamente el UID, PID, PPID y COMMAND de cada proceso. Por ejemplo:
$prompt> ./lista_procesos_usuarios 0 500
Usuario 0:
UID PID PPID COMMAND
0 1 0 init[2]
0 2 0 [kthreadd]
0 3 2 [migration/0]
...
NOTA1: La salida del Shell-script debe tener exactamente el mismo formato que el mostrado arriba.
Consejo: Para poder procesar correctamente el comando ps y quedarse con la información que se necesita se recomienda pasar la salida de dicho comando por el comando tr –s " " que nos permitirá obtener a la salida todos los campos del ps separados por un único espacio en blanco. Por ejemplo:
$prompt> ps awxl | tr –s " "
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
SOLUCIÓN AL EJERCICIO 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/sh
if test $# -eq 0
then
echo "El numero de parametros es incorrecto"
echo "USO: lista_procesos_usuarios <UID1> <UID2> ..."
exit 1
else
for i in $*
do
if grep :$i: /etc/passwd > /dev/null
then
var=$(ps awxl | tr -s " " | grep ^." "$i" ".* | cut -d" " -f 2,3,4,13 | sort -nk 2)
echo " "
echo "Usuario $i:"
echo "UID PID PPID COMMAND"
echo "$var"
else
echo " "
echo "El usuario $i no pertenece al sistema"
fi
done
exit 0
fi
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
EJERCICIO 2
Realizar, utilizando AWK, el mismo Shell-script que el problema 1 pero mostrando de cada usuario únicamente los procesos con VSZ mayor o igual que la cantidad indicada en el primer parámetro del Shell-script. Por ejemplo:
$prompt> ./lista_procesos_usuarios 4096 0 500
NOTA1: La salida del Shell-script debe tener exactamente mismo formato que el mostrado en el problema 1.
NOTA2: Es obligatorio que el programa AWK esté implementado en un fichero propio y aparte del Shell- script llamado lista_procesos_usuarios.awk
Consejo: Para poder procesar correctamente el comando ls con el AWK se recomienda pasar la salida de dicho comando por el comando tr –s " " que nos permitirá obtener a la salida todos los campos del ls separados por un único espacio en blanco. Por ejemplo:
$prompt> ps awxl | tr –s " "
Mi duda, es como pasarlo a awk, e incorporar lo de VSZ.
Gracias.
Valora esta pregunta


0