IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[Bash] Trier par ordre alphanumérique dans un fichier de sortie


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 75
    Points
    75
    Par défaut [Bash] Trier par ordre alphanumérique dans un fichier de sortie
    Bonjour,

    Je rencontre un petit soucis pour le résultat d'un audit que je dois faire.

    Je dois récupérer la non existance de certains fichiers à remettre aux normes dans différents conteneurs.

    Mon soucis est que je n'arrive pas à trier le fichier de sortie comme je le voudrais malgrer les différentes méthodes testés avec sortJ'ai essayé sans succès le -V ou -k3k,3VJ'ai en retour sort: multi-character tab `-V' sort: multi-character tab `-k3k,3V'Je suis certains de mal placé mon sort (très longtemps que je l'ai utilisé dans un script étant passer un peu au python pour ma mission actuelle)

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #!/bin/bash
    #set -x
     
    ##Récupération de tous les Home utilisateurs (différencier zinc, jaspe, jade) qui ont un bash (grep -v nologin ou false)
     
    CONTE=$1
    LOGIN=$(getent passwd | egrep -v '(nologin|false|root|sync|shutdown|halt|nagios|copykey|nbackup|exploit|exploi4c|compta)' $CONTE | awk -F ":" '{print $1}')
    CONT=$(getent passwd $LOGIN|cut -d/ -f3)
     
    #log
    LOGbash=/ccc/common/exploit/script_en_test/IBL/log
    LOGbash2=/ccc/common/exploit/script_en_test/IBL/log
    LOGbash3=/ccc/common/exploit/script_en_test/IBL/log
    > $LOGbash/RC_absent.log
    > $LOGbash2/Profile_absent.log
    > $LOGbash3/Profile_RC_absent.log
     
    for USER in $LOGIN
    do
        #echo $USER
        CONT=$(getent passwd $USER|cut -d/ -f3)
        GRP_PRINC=`id -gn $USER`
        if [ "$CONT" = "cont005" ]
        then
            HOM="/ccc/dsk/jasper/vohcalc1/${CONT}_user/$GRP_PRINC/$USER"
        elif [ "$CONT" = "cont000" ]
        then
            if [ $(echo "$USER" | grep ".*4c$") ]
            then
                HOM="/ccc/dsk/zinc/home/$CONT/$USER"
            elif [ $(echo "$USER" | grep ".*4t$") ]
            then
                HOM="/ccc/dsk/jasper/volhcalc1/${CONT}_user/$GRP_PRINC/$USER"
            else
                HOM="/ccc/cont000/dsk/jedi/home/user/$GRP_PRINC/$USER"
            fi
        elif [ "$CONT" = "cont999" ]
        then
            HOM="/ccc/dsk/jasper/vohcalc1/${CONT}_user/$GRP_PRINC/$USER"
        else
            HOM="/ccc/dsk/zinc/home/$CONT/$GRP_PRINC/$USER"
        fi
        #if [ $? -ne 0 ]
        if [ ! -f $HOM/.bashrc ]
        then
            echo $USER $GRP_PRINC $CONT >> $LOGbash/RC_absent.log
        elif [ ! -f $HOM/.bash_profile ]
        then
            echo $USER $GRP_PRINC $CONT | sort -t -V  >> $LOGbash2/Profile_absent.log
        elif [ ! -f $HOM/.bash_profile ] && [ ! -f $HOM/.bashrc ]
        then
            echo "RC et PROFILE absent pour $USER"
            echo $USER $GRP_PRINC $CONT  >> $LOGbash3/Profile_RC_absent.log
        fi
     
    done
    Ma sortie actuelle est du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    xtoto ll2089 cont005
    ytutu mn9064 cont003
    ztete mms cont003
    ptiti jo9065 cont003
    cwiki pap2112 cont005
    Et je souhaite la trier ainsi cont000 cont0001....

  2. #2
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut Sort...ilège
    Salut,

    Euh… comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ sort -V -k 3 plop 
    bertrano bull cont000
    cohene gen1736 cont003
    p529wu dsm cont003
    roccad gen5106 cont003
    demoulif pa1507 cont005
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  3. #3
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Bonjour,

    bonne réponse de l'amiral.

    Et pour ceux qui font une allergie sur les options:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ awk '{print $3,$1,$2}' trichoisi |sort
    cont000 bertrano bull
    cont003 cohene gen1736
    cont003 p529wu dsm
    cont003 roccad gen5106
    cont005 demoulif pa1507
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Membre régulier
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 75
    Points
    75
    Par défaut
    Bonjour,

    Merci du retour, j'ai donc essayé à la première heure de placer le awk ou le sort dans mon fichier de sortie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    elif [ ! -f $HOM/.bash_profile ]
        then
            echo $USER $GRP_PRINC $CONT | awk '{print $3,$1,$2}'  |sort  >> $LOGbash2/Profile_absent.log
        elif [ ! -f $HOM/.bash_profile ] && [ ! -f $HOM/.bashrc ]
    
    Sortie:
    cont005 tututoto rxx1850
    cont003 tototiti yy7222
    cont003 test ge7078
    cont005 dududidi aa1923
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    elif [ ! -f $HOM/.bash_profile ]
        then
            echo $USER $GRP_PRINC $CONT | sort -V -k 3   >> $LOGbash2/Profile_absent.log
        elif [ ! -f $HOM/.bash_profile ] && [ ! -f $HOM/.bashrc ]
    
    Sortie: 
    xtoto ll2089 cont005
    ytutu mn9064 cont003
    ztete mms cont003
    ptiti jo9065 cont003
    cwiki pap2112 cont005
    Pour le awk ok il est bien présentable avec le cont en premier mais il reste dans le desordre pour le cont (meme en ajoutant l'option -V au sort)

    Et le sort sur la sortie de mon fichier, le contenu reste inchangé.

    Je suis entrain de me poser la question si sort propose réellement le tri alphanumérique, ou si il ne faudrait pas split des 3 derniers digites en y ajoutant un espace ou autre séparateur pour ensuite le retirer une fois le tri fini. Mais ca alourdirai condisérablement mon scripts en temps d'execution.

  5. #5
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    • Non mais attends. Tu ne mets pas le pipe au bon endroit. Tu tries chaque ligne d'utilisateur... Donc évidemment, le sort ne sert à rien.

      Il faut mettre ton pipe en fin de boucle:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      for USER in $LOGIN
      do
         (...)
      done  | sort -t -V  >> $LOGbash2/Profile_absent.log
      ou alors le mettre à coin dans un fichier et trier ce fichier après coup.(puisque, selon tes 'if', ce n'est pas forcément triés)
    • Le tri numérique ou alphabétique est identique si tu a le même nombre de chiffres car 3 est avant 5 comme "3" est avant "5".
    • Si tu veux un tri décroissant, effectivement, -V est incontournable. (à moi de trier dans awk )
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Membre régulier
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 75
    Points
    75
    Par défaut
    Si je fais ma blonde, j'avoue que j'etais buté à le faire à la sortie de mon IF afin de tout faire dans une double, donc pas le choix de faire 3 boucles pour 3 fichiers au final ca sera le plus simple

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trier par ordre croissant des valeurs dans un tableau
    Par ftrap dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 26/06/2013, 10h35
  2. Trier par ordre chronologique le contenu d'un fichier log
    Par Schum25 dans le forum Général Python
    Réponses: 9
    Dernier message: 06/06/2012, 11h15
  3. Réponses: 3
    Dernier message: 11/01/2011, 10h44
  4. [FAQ] Trier par ordre... non-alphabétique
    Par kaceo dans le forum Langage SQL
    Réponses: 15
    Dernier message: 02/02/2006, 09h17
  5. Réponses: 21
    Dernier message: 29/09/2005, 19h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo