Posez votre question Signaler

Script shell AWK [Résolu]

JC - Dernière réponse le 23 janv. 2008 à 10:02
Bonjour,
je souheterais créer un fichier csv avec les champs :
serveur : user : group : date expiration : etat date expiration
j'ai créé un script avec une commande AWK qui récupère l'etat d'expiration des user à partir de /etc/shadow (en nombre de jour >0 ou <0)
par contre, pour les champs date d'expiration et group je galère.
dans /etc/shadow, la date d'expiration est notée en nombre de jours depuis 1970. Est-ce que je peux convertir ça en date ?
Sinon est-ce que je peux integrer la commande CHAGE dans AWK ?
Et pour le groupe, je pensais utiliser la commande id mais comment integrer ça dans le AWK ?
voila à quoi ressemble mon AWK pour l'instant :
jour=$((sec/86400))
awk -v "jour=$jour", -v "hostname=$hostname" -F ":" '{print $hostname":"$1": " $8-jour}' /etc/shadow
Merci pour votre aide !!!
Lire la suite 

Script shell AWK »

12 réponses
Réponse
+0
moins plus
Salut,

dans /etc/shadow, la date d'expiration est notée en nombre de jours depuis 1970. Est-ce que je peux convertir ça en date ?
Oui :
$ A="212814"
$ A=$(($A * 86400))
$ echo $A
18387129600
$ date -u -d "1970-01-01 $A seconds" +"%d-%m-%Y"
03-04-2008
Voir "info date" pour plus de détails...
Ajouter un commentaire
Réponse
+0
moins plus
Merci c'est utile..

mais comment je peux faire intégrer la conversion pour chaque user de /etc/shadow dans mon AWK ?

merci
Ajouter un commentaire
Réponse
+0
moins plus
J'ai bien trouvé la syntaxe sous "awk" qui serait sensée permettre de faire la même chose que sous le shell "bash" avec la date, mais ça marche pas et je comprends pas pourquoi !!!
$ awk -F":" '/jp/ { print $8 }' fich.txt
212814

$ awk -F":" '/jp/ { print ($8 * 86400) }' fich.txt
1,83871e+10

$ awk -F":" '/jp/ { print strftime ( "%d-%m-%Y" , ($8 * 86400)) }' fich.txt
13-12-1901
Si on y colle la date du jour ça marche :
$ awk -F":" '/jp/ { print strftime ( "%d-%m-%Y" , systime()) }' fich.txt
18-01-2008
???

Si ça parle à quelqu'un, merci de me permettre de me coucher moins c*n ce soir ;-)))
Ajouter un commentaire
Réponse
+0
moins plus
essaye sans espaces car chez moi ça marche !

voila le script qui marche

#!/bin/sh
sec=`date +%s`
jour=$((sec/86400))
FILE=/home/exec_cmd/expire2.tmp
hostname=`hostname`
echo $hostname
echo "" > $FILE
awk -v "jour=$jour" -F":" '$8 >0 {print $1 ":" $8-jour ":" strftime ( "%d-%m-%Y" , $8*86400)} $8 == "" {print $1 ":Jamais"}' /etc/shadow >> $FILE

Il me reste un dernier probleme c'est la récupération du groupe de chaque user (à integrer dans le AWK)...

en tout cas chapeau JP !
Ajouter un commentaire
Réponse
+0
moins plus
Même sans espace c'est pareil ;-(((
Ajouter un commentaire
Réponse
+0
moins plus
et si tu copie/colle mon script et que tu le lances ?

(la variable FILE est à modifier)
Ajouter un commentaire
Réponse
+0
moins plus
Ben c'est déjà fait, mais toujours pareil ;-((
Ajouter un commentaire
Réponse
+0
moins plus
le GID se trouve dans /etc/passwd, le nom du groupe dans /etc/group, donc je ferais:
awk -v "jour=$jour" -F":" 'BEGIN {while("cat /etc/passwd "|getline)pwd[$1]=$4} ; $8 >0 {print $1 ":" ......

et donc pwd[$1] c'est le GID, $1 étant le user
si je veux le nom du groupe
awk -v "jour=$jour" -F":" 'BEGIN {while("cat /etc/group "| getline)grp[$3]=$1 ; while("cat /etc/passwd "|getline)pwd[$1]=grp[$4]} ; $8 >0 {print $1 ":" ......

et donc pwd[$1] c'est le group_name
jipicy - 19 janv. 2008 à 18:52
Merci ;-))
Ajouter un commentaire
Réponse
+0
moins plus
On peut condenser la deuxième version:
awk -v "jour=$jour" -F":" 'BEGIN {while("cat /etc/group /etc/passwd "| getline)NF==4 ? grp[$3]=$1: pwd[$1]=grp[$4]} ; ....
jipicy - 20 janv. 2008 à 10:26
Thanks again ;-))
Ajouter un commentaire
Réponse
+0
moins plus
Merci à tous ! ça marche nickel !
Ajouter un commentaire
Ce document intitulé « Script shell AWK » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
5 extensions si vous voulez revenir à l'ancien Facebook