Forum Programmation.shell Exploiter retour commande

Posté par  . Licence CC By‑SA.
Étiquettes :
-1
15
juil.
2017

Bonjour,

Je cherche à exploiter les retours de commande de façon simple mais je n'arrive pas à faire ce que je fais très facilement en PowerShell sous Windows. Je m'explique :

En Powershell je tape ceci :

PS C:\Users\user\Documents> Get-WmiObject win32_logicaldisk

Et j'obtiens ça :

DeviceID     : C:
DriveType    : 3
ProviderName : 
FreeSpace    : 43717443584
Size         : 107164463104
VolumeName   : 

DeviceID     : D:
DriveType    : 3
ProviderName : 
FreeSpace    : 350521815040
Size         : 578196054016
VolumeName   : DONNEES

DeviceID     : E:
DriveType    : 3
ProviderName : 
FreeSpace    : 35703640064
Size         : 64419262464
VolumeName   : BETA

Mais si je tape ceci :

PS C:\Users\thoma\Documents> $(Get-WmiObject win32_logicaldisk).DeviceID

J'obtiens directement ça :

C:
D:
E:

J'aimerais donc faire la même chose avec cette commande sous Linux en ne prenant par exemple que la colonne Name :

root@debian:/home/user# lsblk  -d -e 11

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda    8:0    0   8G  0 disk
sdb    8:16   0  15G  0 disk
sdc    8:32   0  10G  0 disk
sdd    8:48   0   5G  0 disk

Est-ce possible sans passer par des grep, awk, sed et j'en passe ? Si oui je suis preneur de la méthode.

Merci d'avance.

  • # non standard

    Posté par  . Évalué à 2.

    A moins de disposer d'un shell qui propose cette fonctionnalité en se basant sur un standard lambda, ce n'est pas possible.

    Le rôle d'un shell est d’exécuter les commandes qui lui sont données et d'en afficher la sortie. Il ne peut pas gérer ce qui en sort pour la bonne et simple raison que le format de sortie d'une commande X différera de celui d'une commande Y. Cela nécessiterait une standardisation qui n'existe pas à ma connaissance.

    le rôle de grep, awk, sed et j'en passe est justement de gérer des données textuelles variées telles que celles produites par les commandes données à un shell.

    • [^] # Re: non standard

      Posté par  . Évalué à 2.

      Ok ok mais justement le problème de grep, awk… c'est qu'en fonction de la sortie d'une install à une autre il peut y avoir quelques petites variantes et donc ça finit par faire bricolage comme méthode..

      Et qu'est-ce qui sous Linux permettrait de faire ce que j'utilise en PowerShell ? Un autre langage peut-être ?

      • [^] # Re: non standard

        Posté par  . Évalué à 2.

        c'est qu'en fonction de la sortie d'une install à une autre il peut y avoir quelques petites variantes

        tu veux dire que la sortie de lsblk va être différente en fonction de la distribution que tu installes ? ca ne dépend pas directement de la distribution, mais de la version de lsblk utilisée.

        Et qu'est-ce qui sous Linux permettrait de faire ce que j'utilise en PowerShell ? Un autre langage peut-être ?

        ce que tu veux faire c'est écrire un nouveau "j'en passe" :)
        utiliser les outils qui existent te facilitera grandement la vie.

        Dans ton cas lsblk -d -e 11 | cut -f1 -d' ' fera l'affaire.
        man cut pour comprendre les détails de cette commande

        • [^] # Re: non standard

          Posté par  . Évalué à 1.

          Ce que tu proposes j'y étais arrivé également. Mais je me retrouve avec :

          NAME
          sda
          sdb
          sdc
          sdd
          

          Donc faut encore intervenir pour faire sauter la 1ère ligne. Alors oui je l'ai fait également mais je ne trouve pas ça propre… C'est pour ça que je demandais conseil afin de savoir ce qu'il était possible de faire ?

          • [^] # Re: non standard

            Posté par  . Évalué à 1.

            Tu peux ajouter l'option -n à lsblk pour ne pas avoir les en-têtes.

            • [^] # Re: non standard

              Posté par  . Évalué à 1.

              Bien vu j'avais zappé cette option dans le man.

              Bon mon script sera plus lourd en Shell qu'en PowerShell mais ça devrait le faire.

              • [^] # Re: non standard

                Posté par  . Évalué à 2.

                Avec awk, pour extraire les éléments d'une colonne en lui passant le nom de la colonne en paramètre :

                lsblk  -d -e 11 | awk -v column=TYPE '
                NR == 1 { 
                  for (i=1; i <= NF; i++) { 
                    if (column == $i) {  
                      FIELD=i 
                    } 
                  } 
                } 
                NR>1 { 
                  print $FIELD
                } '
              • [^] # Re: non standard

                Posté par  (site web personnel) . Évalué à 4.

                lsblk -d -n --output name -l
                

                Non ?
                Ou alors j'ai pas compris la question.

                • [^] # Re: non standard

                  Posté par  . Évalué à 1.

                  Ah ba c'est parfait ça. Un grand merci ;)

                  • [^] # Re: non standard

                    Posté par  (site web personnel) . Évalué à 1.

                    En vrai, pas mal de commandes sont assez flexibles sur l'output et te permettent de scripter facilement sans awk/grep/autre.
                    Suffit juste d'être assez attentif sur les options proposées.

  • # fonctions lexiques d'OpenVMS

    Posté par  (site web personnel) . Évalué à 2.

    en fait tu veux les fonctions lexiques de OpenVMS

    http://h41379.www4.hpe.com/doc/84final/9996/9996pro_136.html

    exemple du help de f$getjpi

    (get job process information)

    Lexicals

    F$GETJPI

    Arguments


    pid
    Specifies the process identification (PID) number of the process
    for which information is being reported. Specify the pid argument
    as a character string expression. You can omit the leading zeros.

    If you specify a null string (""), the current PID number is
    used.
    You cannot use an asterisk (*) or percent sign (%) wildcard
    character to specify the pid argument in the F$GETJPI function,
    as you can with the $GETJPI system service. To get a list of
    process identification numbers, use the F$PID function.

      item
    ```         Indicates the type of process information to be returned. Specify
             the item argument as a character string expression. You can
             specify any one of the following items:
    
     ACCOUNT              APTCNT                 ASTACT
     ASTCNT               ASTEN                  ASTLM
     AUTHPRI              AUTHPRIV               BIOCNT
     BIOLM                BUFIO                  BYTCNT
     BYTLM                CASE_LOOKUP_IMAGE*     CASE_LOOKUP_PERM*
     CLASSIFICATION*      CLINAME                CPULIM
     CPUTIM               CREPRC_FLAGS           CURPRIV
     CURRENT_CAP_MASK*    DFPFC                  DFWSCNT
     DIOCNT               DIOLM                  DIRIO
     EFCS                 EFCU                   EFWM
     ENQCNT               ENQLM                  EXCVEC
     FAST_VP_SWITCH       FILCNT                 FILLM
     FINALEXC             FREP0VA                FREP1VA
     FREPTECNT            GPGCNT                 GRP
     HOME_RAD            IMAGECOUNT             IMAGE_AUTHPRIV*
     IMAGE_PERMPRIV*      IMAGE_WORKPRIV*        IMAGNAME
     IMAGPRIV             INSTALL_RIGHTS*        INSTALL_RIGHTS_SIZE*
     JOBPRCCNT            JOBTYPE                LAST_LOGIN_I
     LAST_LOGIN_N         LOGIN_FAILURES         LOGIN_FLAGS
     LOGINTIM             MASTER_PID             MAXDETACH
     MAXJOBS              MEM                    MODE
     MSGMASK              MULTITHREAD            NODENAME
     NODE_CSID            NODE_VERSION           OWNER
     PAGEFLTS             PAGFILCNT              PAGFILLOC
     PARSE_STYLE_PERM*    PARSE_STYLE_IMAGE*     PERMANENT_CAP_MASK*
     PERSONA_AUTHPRIV*    PERSONA_ID*            PERSONA_PERMPRIV*
     PERSONA_RIGHTS*      PERSONA_RIGHTS_SIZE*   PERSONA_WORKPRIV*
     PGFLQUOTA            PHDFLAGS               PID
    
    tu as f$getsyi qui te donne des infos sur ton matériel, la date du boot, la mémoire
    
    
    
    

    ウィズコロナ

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.