Partage
  • Partager sur Facebook
  • Partager sur Twitter

Redirection de plusieurs sorties dans un fichier

fichier final avec plusieurs colonnes et non une seule

Sujet résolu
    6 mai 2018 à 1:51:31

    Bonsoir!

    J'essaye d'écrire un script pour me faire gagner du temps, pour l'instant ce n'est pas gagné lol

    Je voudrais rediriger la sortie de mes commandes de tri dans un fichier en plusieurs colonne. Le but étant de faire un graphique avec gnuplot. Donc une première colonne avec les abcisses, la seconde les ordonnées et voir une 3ème pour expérimenter les graphes 3D.

    Pour l'instant mes sorties se mettent l'une à la suite de l'autre en une seule colonne :(

    voici le bout de code que j'utilise dans un script bash :

       #!/bin/bash
      
       for var in 1 2 3 4 5 6 7 8 9 10; do
               cat /sys/kernel/debug/dri/2/amdgpu_pm_info | grep -w MCLK | cut -c 2-5>> test.txt & cat /sys/kernel/debug/dri/2/amdgpu_pm_info | grep -w SCLK | cut -c 2-5>> test.txt
               sleep 1
      
      done

    Le script récupère les infos des fréquences memory et gpu de la carte graphique toutes les secondes (le sleep 1) 10 fois.

    J'aimerais mettre dans le fichier test.txt en 1ère colonne touts les résultats de ce qui est à gauche du "&" et en seconde colonne touts les résultats qui se trouve à droite de ce "&". En option, une 3ème colonne avec un autre paramètre pour le fun des graphes 3D

    Là je sèche....

    Merci et au plaisir de vous lire :)

    • Partager sur Facebook
    • Partager sur Twitter
      6 mai 2018 à 3:17:10

      salut,

      attention aux UUOC !

      tu rediriges vers plusieurs fichiers, puis tu utilises paste sur ces fichiers en en redirigeant la sortie vers un autre fichier.

      • Partager sur Facebook
      • Partager sur Twitter

      Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

        6 mai 2018 à 11:33:40

        Merci beaucoup! Je viens d'essayer la commande paste et elle est facile d'utilisation :)

        Après une recherche avec mon meilleur ami, un moteur de recherche très bien connu, je suis tombé sur la signification de UUOC : l'utilisation inutile de cut. Je mourrai moins bête :)

        Est-il possible d'améliorer le bout de code posté dans mon message initial?

        • Partager sur Facebook
        • Partager sur Twitter
          6 mai 2018 à 12:23:14

          awk..., plutôt que grep...|cut... ?

          awk 'function maFonc(arg){print substr($0,2,5),$0 >>arg".txt"}/MCLK/{maFonc("mlck"}/SCLK/{maFonc("sclk")}'

          pour le confirmer, à quoi ressemblent  les lignes recherchées, et les sorties correspondantes ?

          • Partager sur Facebook
          • Partager sur Twitter

          Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

            6 mai 2018 à 14:29:29

            Aaaah j'étais tombé sur awk mais j'avais pas trop compris, une commande qui est un langage de programmation......

            je te détaille un peu plus :

            la commande

            cat /sys/kernel/debug/dri/2/amdgpu_pm_info

            donne en sortie 

            Clock Gating Flags Mask: 0x37bcf
            	Graphics Medium Grain Clock Gating: On
            	Graphics Medium Grain memory Light Sleep: On
            	Graphics Coarse Grain Clock Gating: On
            	Graphics Coarse Grain memory Light Sleep: On
            	Graphics Coarse Grain Tree Shader Clock Gating: Off
            	Graphics Coarse Grain Tree Shader Light Sleep: Off
            	Graphics Command Processor Light Sleep: On
            	Graphics Run List Controller Light Sleep: On
            	Graphics 3D Coarse Grain Clock Gating: Off
            	Graphics 3D Coarse Grain memory Light Sleep: Off
            	Memory Controller Light Sleep: On
            	Memory Controller Medium Grain Clock Gating: On
            	System Direct Memory Access Light Sleep: Off
            	System Direct Memory Access Medium Grain Clock Gating: On
            	Bus Interface Medium Grain Clock Gating: Off
            	Bus Interface Light Sleep: On
            	Unified Video Decoder Medium Grain Clock Gating: On
            	Video Compression Engine Medium Grain Clock Gating: On
            	Host Data Path Light Sleep: Off
            	Host Data Path Medium Grain Clock Gating: On
            	Digital Right Management Medium Grain Clock Gating: Off
            	Digital Right Management Light Sleep: Off
            	Rom Medium Grain Clock Gating: On
            	Data Fabric Medium Grain Clock Gating: Off
            
            GFX Clocks and Power:
            	2000 MHz (MCLK)
            	900 MHz (SCLK)
            	74.255 W (VDDC)
            	16.0 W (VDDCI)
            	103.24 W (max GPU)
            	103.101 W (average GPU)
            
            GPU Temperature: 51 C
            GPU Load: 100 %
            

            Les info qui m'intéresse sont uniquement les valeur (MCLK), (SCLK) et (average GPU) sans leurs unités, en formatant le fichier final, je saurai que la 1ère colonne est la fréquence mémoire, la seconde celle du core et la dernière celle de la puissance consomée par la carte.

            Mon but final est un script d'automatisation mais j'essaie d'aller pas-à-pas.


            • Partager sur Facebook
            • Partager sur Twitter
              6 mai 2018 à 16:04:22

              for i in {1..10}
              do
                 awk '/\(([SM]CLK|average GPU)\)$/{print $1}' amdgpu_pm_info | xargs -n3
                 sleep 1
              done
              2000 900 103.101
              2000 900 103.101
              2000 900 103.101
              2000 900 103.101
              2000 900 103.101
              2000 900 103.101
              2000 900 103.101
              2000 900 103.101
              2000 900 103.101
              2000 900 103.101

              il faudra peut-être consolider le script awk, si l'ordre des données peut changer, si des données peuvent ne pas figurer...
              en assignant des variables pour chaque expression recherchée.

              alors xargs ne sera peut-être plus nécessaire, car c'est awk qui assurera le formatage.

              • Partager sur Facebook
              • Partager sur Twitter

              Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                6 mai 2018 à 16:41:53

                Merci beaucoup!!!! Et même plus besoin de paste :ange:. C'est donc cela la puissance d'un utilisateur de Archlinux :magicien: J'essaie de comprendre la syntaxe maintenant. J'y ai fait une petite modif mais ça fonctionne parfaitement :)

                Dans la boucle de ce post, elle commence à 1 et se termine à 10 en s'incrémenant de 1.

                Y a-t-il une syntaxe comme dans le C pour la boucle for? Je parle de la valeur de départ jusqu'à la valeur finale suivant une incrémentation qu'on peu spécifier? Je pense avoir vu -le pour "less equal" -e "equal" mais rien trouvé au sujet du step à incrémenter

                Dans le langage C, si je ne m'abuse (un exemple) :

                for (i=0, i < 100, i++)
                { code.....;
                  i=i+3;
                }
                

                J'aurai besoin d'une syntaxe pour ma boucle qui englobera celle-là. Partir d'une valeur, arriver à un seuil et monter graduellement d'une certaine valeur.

                Ou peut-être utiliser une boucle while en fixant la valeur de départ.

                Mais d'abord comprendre la syntaxe que tu m'as fournit pour awk!



                • Partager sur Facebook
                • Partager sur Twitter
                  6 mai 2018 à 17:04:20

                  ça dépend.
                  les valeurs sont-elles des variables, ou des constantes en dur ?

                  constantes en dur :

                  for i in {1..10..2}

                  des variables :

                  d=1 f=10 p=2
                  for (( i=d; i<=f; i+=p ))




                  • Partager sur Facebook
                  • Partager sur Twitter

                  Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                    6 mai 2018 à 17:27:17

                    J'ai trouvé la réponse à ma question :)

                    Je fait un test et je post mon script. J'ai utilisé while :zorro:

                    Bon ça fonctionne presque....... il s'arrête à la 1ère valeur limite et ne retourne pas au début la 1ère boucle. Le but étant de faire varier 2 paramètres (mclk et sclk), en fixant la 1ère et modifiant la seconde.

                    Donc, j'initialise mclk et sclk à 300.

                    D'abord je travaille avec sclk à la valeur initiale et je fais varier mclk jusque 350. Une fois mclk à 350 atteint, j'aimerais incrémenter sclk de 10 et rebelote pour mclk qui repart de sa valeur initiale jusque 350.... et ainsi de suite jusqu'à ce que sclk a atteint la valeur fixée de 350.

                    350 est une valeur pas trop grande pour pouvoir faire des tests du scripts assez rapide....

                    #!/bin/bash
                    
                    freq_mem=300
                    freq_core=300
                    
                    while [ $freq_core -le 350 ]
                    do
                    
                    while [ $freq_mem -le 350 ]
                    	
                    	do
                    	/home/johnpierro/./wolfamdctrl -i 2 --core-state 7 --mem-state 2 --core-clock $freq_core --mem-clock $freq_mem 
                    	sleep 1	
                    		for i in {1..10}
                    		do
                       		awk '/\(([SM]CLK|average GPU)\)$/{print $1}' /sys/kernel/debug/dri/2/amdgpu_pm_info | xargs -n3 >> essai.txt
                       		sleep 1
                    		done
                    	((freq_mem=$freq_mem+10))
                    	done
                    ((freq_core=$freq_core+10))
                    done
                    

                    UP!!!!!!!! J'ai trouvé wahouuuuu

                    je devais ré-initialisé la veleur de freq_sclk tout juste après le début de la 1ère boucle!!!

                    donc voici le code :

                    #!/bin/bash
                    
                    freq_mem=300
                    freq_core=300
                    
                    while [ $freq_core -le 350 ]
                    do
                    freq_mem=300
                    	while [ $freq_mem -le 350 ]
                    	
                    		do
                    		/home/johnpierro/./wolfamdctrl -i 2 --core-state 7 --mem-state 2 --core-clock $freq_core --mem-clock $freq_mem 
                    		echo 180 > /sys/class/drm/card2/device/hwmon/hwmon2/pwm1
                    		sleep 10	
                    			for i in {1..10}
                    			do
                       			awk '/\(([SM]CLK|average GPU)\)$/{print $1}' /sys/kernel/debug/dri/2/amdgpu_pm_info | xargs -n3 >> essai.txt
                       			sleep 1
                    			done
                    		((freq_mem=$freq_mem+10))
                    	done	
                    ((freq_core=$freq_core+10))
                    done
                    

                    Merci pour l'aide! Je peux t'appeler Maître?

                    Maintenant je peux passer à l'étape suivante : insérer une 4ème colonne venue d'un programme et non d'info systeme. Apparemment, je dois utiliser pyhton avec Json car cette valeur se trouve sur une page web générée par le dit programme..... C'est pas encore gagné mais j'y crois :ninja:

                    Encore merci Dantonq (je viens de piger) pour l'aide que tu as donné.....

                    -
                    Edité par redman6150 6 mai 2018 à 18:44:37

                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 mai 2018 à 18:38:25

                      freq_mem doit être (ré)initialisée avant le début de sa boucle.

                      je trouve ça difficilement lisible (l'erreur que tu as faite ne serait pas apparue), les boucles while "arithmétique"; c'est d'autant plus moche qu'il y a une forme de boucle for pour ça. ;)

                      -
                      Edité par dantonq 6 mai 2018 à 18:42:56

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                        6 mai 2018 à 18:56:48

                        Je ne suis pas contre une forme plus lisible :)

                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 mai 2018 à 19:00:43

                          dantonq a écrit:

                          d=1 f=10 p=2
                          for (( i=d; i<=f; i+=p )); do : things; done

                          -
                          Edité par dantonq 6 mai 2018 à 19:01:02

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                            7 mai 2018 à 2:45:28

                            Je me suis assoupi :-°

                            J'ai lancé mon script avec les boucles while mais j'ai ré-écris le script avec les boucle for. J'essaierai cela lorsque le 1er script sera fini :lol:

                            #!/bin/bash
                            
                            #d=1 f=10 p=2
                            #for (( i=d; i<=f; i+=p )); do : things; done
                            
                            sleep 120 #attentdre 2min le temps pour le mineur de lancer complètement
                            
                            freq_mem=300
                            freq_core=300
                            freq_mem_finale=2200
                            freq_core_finale=1400
                            p=10
                            
                            for(( i=$freq_mem; i<=$freq_mem_finale; i+=$p ))
                            	do
                            	/home/johnpierro/OhGodATool/./ohgodatool -i 2 --mem-state 2 --mem-clock $freq_mem #modification de la fréquence mémoire
                            	sleep 5	#attente de stabilisation de la modification de fréquence
                            	echo 180 > /sys/class/drm/card2/device/hwmon/hwmon2/pwm1 #fixer le ventilo à 70% car ohgodatool modifie ce paramètre
                            
                            	for(( i=$freq_core; i<=$freq_core_finale; i+=$p ))
                            		do
                            		/home/johnpierro/OhGodATool/./ohgodatool -i 2 --core-state 7 --core-clock $freq_core #modification de la fréquence du core
                            		sleep 5 #attente de stabilisation de la modification de fréquence
                            		echo 180 > /sys/class/drm/card2/device/hwmon/hwmon2/pwm1 #fixer le ventilo à 70% car ohgodatool modifie ce paramètre
                            		
                            		for i in {1..10}
                            			do
                               			awk '/\(([SM]CLK|average GPU)\)$/{print $1}' /sys/kernel/debug/dri/2/amdgpu_pm_info | xargs -n3 >> /home/johnpierro/monitoring_580.txt #récupère les fréquences actuelles et la puissance dans un fichier .txt
                               			sleep 1
                            			done
                            		done
                            	done
                            



                            • Partager sur Facebook
                            • Partager sur Twitter
                              7 mai 2018 à 6:09:29

                              attention, il faut un espace entre for et ((

                              le point slash (dans l'adresse vers ohgodatool (quel nom!)) est inutile.

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                                7 mai 2018 à 14:20:05

                                Si jamais tu possèdes une carte ATI récente (famille RX et Vega), ce programme permet de OC et UC ces cartes graphiques en CLI jusqu'au driver graphique amdgpu-pro 17.50. Il est ineffectif avec le dernier sorti 18.20. Il est possible de passer par les moyens recommandés par AMD mais c'est limité. Voici un petit lien qui explique comment faire https://www.phoronix.com/scan.php?page=article&item=radeon-rx580-oc&num=1 . Cette méthode permet un OC par % (+3% par exemple) sans pour autant pouvoir fixer une valeur précise de Mhz et elle ne permet pas de UC, les nombres négatifs ne sont pris en compte. D'où cette bénédiction de ohgodatool :ange:

                                Pour le script,effectivement! Mais il n'y avait pas que ça comme erreur :

                                • La variable i est déjà utilisée dans la dernière boucle, donc pour la 1ère il faut changer...
                                • Le paramètre que prend les variables $freq ne bougent pas, il faut les remplacer avec les varibales qui sont incrémentées par les boucles donc par j et k par exemple.
                                #!/bin/bash
                                
                                #d=1 f=10 p=2
                                #for (( i=d; i<=f; i+=p )); do : things; done
                                
                                #sleep 120 #attentdre 2min le temps pour le mineur de lancer complètement
                                
                                freq_mem=300
                                freq_core=300
                                freq_mem_finale=2200
                                freq_core_finale=1400
                                p=10
                                
                                for (( k=$freq_mem; k<=$freq_mem_finale; k+=$p ))
                                	do
                                	/home/johnpierro/OhGodATool/ohgodatool -i 2 --mem-state 2 --mem-clock $k #modification de la fréquence mémoire
                                	#sleep 5	#attente de stabilisation de la modification de fréquence
                                	echo 180 > /sys/class/drm/card2/device/hwmon/hwmon2/pwm1 #fixer le ventilo à 70% car ohgodatool modifie ce paramètre
                                	sleep 5	
                                
                                	for(( j=$freq_core; j<=$freq_core_finale; j+=$p ))
                                		do
                                		/home/johnpierro/OhGodATool/ohgodatool -i 2 --core-state 7 --core-clock $j #modification de la fréquence du core
                                		#sleep 5 #attente de stabilisation de la modification de fréquence
                                		echo 180 > /sys/class/drm/card2/device/hwmon/hwmon2/pwm1 #fixer le ventilo à 70% car ohgodatool modifie ce paramètre
                                		sleep 5		
                                	
                                		for i in {1..10}
                                			do
                                   			awk '/\(([SM]CLK|average GPU)\)$/{print $1}' /sys/kernel/debug/dri/2/amdgpu_pm_info | xargs -n3 >> /home/johnpierro/monitoring_580.txt #récupère les fréquences actuelles et la puissance dans un fichier .txt
                                   			sleep 1
                                		done
                                	done
                                done
                                

                                Voilà, je suis satisfait de ce script, maintenant je bosse sur la commande awk. Mon but est d'ajouter une 4ème colonne. J'ai trouvé un script par hasard sur le net en php qui fait les requêtes nécessaires. https://github.com/bobdobs/claymore-ethereum-log-genereator J'y connais absolument rien en php et Json donc j'utiliserai ce script tel quel. A coup de awk et de paste au final je serai capable de le faire. Donc maintenant, travailler sur awk :) Et Gnuplot aussi, je posterai un peu le résultat obtenu.

                                Je rencontre malheureusement un problème de taille, l'instabilité du système. Le système plante donc ne va pas au bout de son travail et c'est un peu dommage.... Il doit pas supporter les changements de fréquences intempestifs >_< Il va falloir diminuer la plage de travail.

                                Merci pour ton coup de main, il a été très précieux. :magicien:

                                UP! Voici 2images faites avec Gnuplot où on peu tirer 1 bonne conclusion :

                                W en fonction de MCLK et SCLK

                                W en fonction de MCLK et SCLK

                                Il y a un saut de consommation entre certaines fréquences. La 4ème colonne qui représentera la vitesse permettra de dire si c'est justifié d'être sur ces fréquences en question.

                                -
                                Edité par redman6150 7 mai 2018 à 15:05:03

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  8 mai 2018 à 16:43:46

                                  AAArgh compliqué le awk. Ca donne tellement d'idées en plus :-°

                                  Me voilà en tête de rajouter une 5ème colonne qui fait la division entre la 4ème colonne et la 3ème. Et avant de faire cette opération, enlever les lignes inutiles ou erronées, trouver le max de la 4ème colonne, faire des comparaisons.......

                                  Dur dur l'automatisation o_O Il faut penser à tout et si il y a une petite erreur de syntaxe ou de formatage, beh c'est foutou :'(

                                  Je passe le post en résolu car mon 1er problème est corrigé. La suite, il suffit de chercher :)

                                  -
                                  Edité par redman6150 8 mai 2018 à 17:25:09

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Redirection de plusieurs sorties dans un fichier

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown