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. 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...
    0
    1. Merci c'est utile..

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

      merci
      0
      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 ;-)))
        0
        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 !
          0
          1. Modérateur
            Même sans espace c'est pareil ;-(((
            0
            1. et si tu copie/colle mon script et que tu le lances ?

              (la variable FILE est à modifier)
              0
              1. Modérateur
                Ben c'est déjà fait, mais toujours pareil ;-((
                0
                1. 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
                  0
                  1. Modérateur
                    Merci ;-))
                    0
                2. 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]} ; ....
                  0
                  1. Modérateur
                    Thanks again ;-))
                    0