Récupérer caractère

Résolu
Bonjour,

Je suis un peu noob sur linux alors mes excuses par avance pour mon manque de vocabulaire ^^

J'ai un fichier toto qui contient une liste formatée ainsi :

machineX process1 process2 process3 process4
machineY process1 process2 process3 process4
machineZ process1 process2 process3 process4

je souhaiterais, par exemple, récupérer que le nom de la machine avec son process2 via une ligne de commande

lorsque je fais:
cat toto | grep "process2"

il me sort toute la ligne :
machineX process1 process2 process3 process4
machineY process1 process2 process3 process4
machineZ process1 process2 process3 process4

moi je voudrais:
machineX process2
machineY process2
machineZ process2

Sauriez vous m'aider svp ?

Merci.

3 réponses

  1. Salut,

    Il existe différents outils te permettant de faire ça comme sed ou awk.

    Avec awk cela pourrait ressembler à ça sur un fichier toto.txt:

    cat toto.txt |awk '/process2/ {print $1,$3}'

    --> si la ligne contient la string "process2" alors afficher le 1er et le 3eme champs de cette ligne, la délimitation se faisant par défaut par l'espace.

    awk '/process2/ {print $1,$3}' toto.txt

    --> Petite optim : pas de raison d'utiliser le pipe dans ton cas, awk prend en argument le fichier.

    awk -F ' ' '/process2/ {print $1,$3}' toto.txt

    --> Pour finir, il peut être utile d'explicitement indiquer le délimiteur à utiliser via l'option -F

    ++
    1. Contributeur
      hello
      $ cut -d ' ' -f 1,3 fichier
      machineX process2
      machineY process2
      machineZ process2
      1. Hello et merci d'avoir pris le tps de me répondre,

        En fait , ce que vous dites est juste mais ne correpsond pas à mon besoin (je me suis mal exprimé au départ).

        Il faudrait faire une recherche de chaine de caractères par ligne.
        "toto" ressemble en fait à :

        machine1 reference process1*c:source process1*c:sink process2*abc process3*i:1 pmlo*i:2 process3*i:3
        machine3 local process1*c:source process1*c:sink process2*i:1 process2*i:2 process2*i:3 process2*i:4 process2*i:5 process2*i:6
        machine4 local process1*c:source process1*c:sink process2*i:1*source_dev process2*i:2*source2_dev process2*i:3 process3*i:3
        machine5 local process1*c:source process1*c:sink process2*i:1 process2*i:2 process2*i:3 process2*i:4 process2*i:5
        machine6 local process1*c:source process1*c:sink process2*i:1 process2*i:2 process3*i:3 process2*i:3 process2*i:4*source_dev

        donc l'impression de colonne ne peut pas fonctionner car le "process3" n'est pas toujours à la même place.

        Je ne sais pas si je suis bien clair alors n'hésitez pas à me dire ^^

        Merci !
        1. Contributeur
          que faut-il extraire de ce fichier ?
          ca ?
          $ awk -v c="process3" '$0 ~ c {printf $1 " "; for (n=2; n<=NF; n++)if($n ~ c)printf $n " "; print ""}'  fichier
          machine1 process3*i:1 process3*i:3
          machine4 process3*i:3
          machine6 process3*i:3
        2. Le nom de la machine et le process 3.

          Ce que je souhaite voir (car il n'ya pas de process 3 sur toutes les machines) :
          machine1 process3*i:3
          machine4 process3*i:3
          machine6 process3*i:3

          Merci
        3. Contributeur
          j'ai modifié mon post précédent
        4. Contributeur
          $ awk -v c="process3" '$0 ~ c {printf $1 " "; for (n=2; n<=NF; n++)if($n ~ c)p=$n; print p}' fichier
          machine1 process3*i:3
          machine4 process3*i:3
          machine6 process3*i:3
        5. @dubcekT'es une star !

          Merci beaucoup, ca fait presque le job :)

          Mais comment faire pour qu'il ne s'arrete pas à la 1ere occurence ?

          Si j'ai sur une ligne :
          machineX process1 process3 process3.A process4 process3.B

          pour récupérer:
          machineX process 3 process 3.A process3.B
          ?

          Merci !!