Récupérer caractère

Résolu/Fermé
Signaler
-
 rebel -
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

Messages postés
91
Date d'inscription
lundi 3 octobre 2005
Statut
Membre
Dernière intervention
1 février 2016
23
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

++
Messages postés
18344
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
26 novembre 2021
5 442
hello
$ cut -d ' ' -f 1,3 fichier
machineX process2
machineY process2
machineZ process2
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 !
>
Messages postés
18344
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
26 novembre 2021

T'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 !!
Messages postés
18344
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
26 novembre 2021
5 442
voir le code post 4
Merci,

Cependant, un pb subsiste, il me manque un espace entre mes process ^^

Avec ton code j'obtiens :
machineX process_3process_3.Aprocess_3.B

Je voudrais :
machineX process_3 process_3.A process_3.B (un esapce entre les process)


Thanks !
Messages postés
18344
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
26 novembre 2021
5 442
$ cat fichier
machineX process1 process3 process3.A process4 process3.B
$ awk -v c="process3" '$0 ~ c {printf $1 " "; for (n=2; n<=NF; n++)if($n ~ c)printf $n " "; print ""}' fichier
machineX process3 process3.A process3.B
Thanks very much ! T'es un chef.