• Publicidad

Lectura y formateo de un archivo en AIX

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Lectura y formateo de un archivo en AIX

Notapor mutearg » 2010-11-30 15:53 @703

Hola a todos, recién me acabo de registrar y aprovecho a saludarlos y comenzar a molestarlos con preguntas, ¡ja,ja,ja!

En mi trabajo quiero generar un programita Perl que genere un listado de todos los usuarios en AIX con sus lastupdates en formato legible para humanos.

Ya que en AIX el formato de fecha es otro, y la idea es traducirlo.

La idea es tomar del /etc/security/passwd la información de los usuarios con sus "lastupdate" y escribirlos en otro archivo con las fechas legibles.

Si yo tengo en passwd:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
usuario:
           password : Asdg4%1232
           lastupdate : 122342344

usuario 2 :
           password : dfda(/%&$s
           lastupdate : 1234234455
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Me gustaría pasarlo a un archivo donde quede así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
usuario:2 de octubre 2010
usuario 2 : 10 de noviembre 2010
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


y así...

¿Alguien me podría ayudar cómo lo hago?

Estoy intentando con OPEN y readline, pero no se me ocurre cómo tomar el usuario, lastupdate y su fecha y pasarlo a otro archivo.

Les agradecería muchísimo si me pudiesen guiar.

Muchas gracias de antemano.
mutearg
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-11-30 15:00 @667

Publicidad

Re: Lectura y formateo de un archivo en AIX

Notapor explorer » 2010-11-30 17:26 @768

Bienvenido a los foros de Perl en Español, mutearg.

Sería interesante ver el código que tienes hasta ahora.

Y saber qué significa la cifra de lastupdate, porque si los paso a segundos desde el epoch, no me salen las fechas que indicas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Lectura y formateo de un archivo en AIX

Notapor mutearg » 2010-12-01 10:37 @484

Explorer, gracias por responder.
Te comento que soy bastante novato en el tema, quizás me aventuré demasiado, pero bueno, vale la pena.

Por ahora tengo este código, que en realidad lo que hace es copiar el archivo /etc/security/passwd a un archivo passwords.txt, y luego leer ese archivo.

Lo difícil y que no se me ocurre es cómo es formatear passwords.txt para que quede:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
usuario:(fecha legible de lastupdate)
usuario2:(fecha legible de lastupdate)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Por otro lado, descubrí que con la siguiente sentencia puedo pasar el formato de fecha de AIX a formato de fecha humano: perl -e 'print "".localtime 1288806919'

Muchas gracias, y les agradecería si me pueden orientar para sacarlo y razonarlo.
mutearg
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-11-30 15:00 @667

Re: Lectura y formateo de un archivo en AIX

Notapor explorer » 2010-12-01 17:08 @755

Bueno, con el siguiente programa,
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3. use strict;
  4. use warnings;
  5. use diagnostics;
  6.  
  7. use open ':locale';     # usamos las localizaciones del juego de caracteres del sistema
  8.  
  9. use File::Slurp;
  10. use POSIX qw(setlocale LC_ALL strftime);
  11.  
  12. ## Pasamos a trabajar en localización española
  13. my $anterior_localizacion = setlocale(LC_ALL, "es_ES");
  14.  
  15. ## Leemos el fichero
  16. my @fichero = read_file('kk.txt');
  17.  
  18. ## usuario que vamos encontrando
  19. my $usuario;
  20.  
  21. ## Para todas las líneas del fichero
  22. for my $linea (@fichero) {
  23.    
  24.     if ($linea =~ /^(\w.+?):/) {
  25.         $usuario = $1;
  26.     }
  27.  
  28.     if ($linea =~ /lastupdate : (\d+)/) {
  29.         say "$usuario:" . strftime "%Ec", localtime $1;
  30.     }
  31. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
sale
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
usuario:sáb 17 nov 1973 00:59:04 CET
usuario 2 :mar 10 feb 2009 03:54:15 CET
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


La primera expresión regular captura un conjunto de caracteres (.+) precedidos por un carácter alfanumérico (\w) al principio de la línea (^) y hasta el primer (?) carácter ':'. Todos los caracteres son capturados por los paréntesis de captura, y almacenados en $1, que luego guardaremos en $usuario.

La segunda expresión regular es más sencilla: capturamos todo número (\d+) que siga al texto 'lastupdate : ' (atento a los espacios en blanco).

Lo mismo de antes, los paréntesis de captura guardarán el número en $1, que luego pasaremos desde segundos desde el EPOCH a segundos, minutos, horas, etc, con la ayuda de localtime(), que luego llevaremos todos esos valores a strftime(), que sacará la fecha "en cristiano".

La salida de strftime() depende de la localización que hayamos elegido, que lo hemos cambiado a es_ES, una de las localizaciones que, suponemos, existe en el sistema operativo.

El formato Ec depende también de la versión de strftime del sistema operativo. Si no funciona, tendremos que consultar la página de manual de strftime y crear una cadena de formato acorde a la salida que queramos.

Si, por casualidad, estamos en un sistema con localización ya en español, podemos obviar algunas cosas, por lo que el programa quedaría así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3. use strict;
  4. use warnings;
  5. use diagnostics;
  6.  
  7. use File::Slurp;
  8. use POSIX qw(strftime);
  9.  
  10. ## Leemos el fichero
  11. my @fichero = read_file('kk.txt');
  12.  
  13. ## usuario que vamos encontrando
  14. my $usuario;
  15.  
  16. ## Para todas las líneas del fichero
  17. for my $linea (@fichero) {
  18.    
  19.     if ($linea =~ /^(\w.+?):/) {
  20.         $usuario = $1;
  21.     }
  22.  
  23.     if ($linea =~ /lastupdate : (\d+)/) {
  24.         say "$usuario:" . strftime "%Ec", localtime $1;
  25.     }
  26. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

(no modificamos el 'open' porque suponemos que strftime() lo sacará según la localización del sistema).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Lectura y formateo de un archivo en AIX

Notapor mutearg » 2010-12-02 15:44 @697

¡WoW!, explorer ¿De dónde sabes tanto?

Increíble, te agradezco mucho.

Estoy investigando cada comando y estudiando las expresiones regulares.

¡¡ Increíble, la verdad !!

¡¡¡ Te agradezco muchísimo !!!

Un saludo
mutearg
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-11-30 15:00 @667


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 9 invitados