Script shell AWK

Résolu
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 !!!
Configuration: Windows XP
Firefox 2.0.0.11

10 réponses

  1. Contributeur
    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]} ; ....
    1. Modérateur
      Thanks again ;-))
  2. Contributeur
    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
    1. Modérateur
      Merci ;-))
  3. et si tu copie/colle mon script et que tu le lances ?

    (la variable FILE est à modifier)
    1. 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 !
      1. Modérateur
        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 ;-)))
        1. Merci c'est utile..

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

          merci
          1. Modérateur
            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...