Script shell AWK

Résolu/Fermé
JC - 18 janv. 2008 à 11:41
 JC - 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 !!!
A voir également:

10 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
18 janv. 2008 à 13:24
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...
0
Merci c'est utile..

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

merci
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
18 janv. 2008 à 14:59
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 ;-)))
0
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 !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
18 janv. 2008 à 16:21
Même sans espace c'est pareil ;-(((
0
et si tu copie/colle mon script et que tu le lances ?

(la variable FILE est à modifier)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
18 janv. 2008 à 16:43
Ben c'est déjà fait, mais toujours pareil ;-((
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
19 janv. 2008 à 15:55
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
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
19 janv. 2008 à 18:52
Merci ;-))
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
20 janv. 2008 à 09:10
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]} ; ....
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
20 janv. 2008 à 10:26
Thanks again ;-))
0
Merci à tous ! ça marche nickel !
0