Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/11/2017, à 21:28

AGP-Architecture

problème avec script perso

Bonsoir à tous,

J'essaie désespérément de faire un script qui liste les ligne en double d'un fichier d'historique pour m’entraîner avec bash. Malheureusement je n'arrive pas à obtenir ce que je veux.

Voici le script:

#!/bin/bash
i=0

for doublon in `cat $1 | sort | uniq`
  do 
	echo ""
	echo doublon : "$doublon"
	#grep -Fnh --color "$doublon" "$1"
	let i=1+$i

done

echo "nb de doublons : $i"

il me semble que le problème vient de la ligne : echo doublon : "$doublon". En effet elle ne prend pas les blancs entre mots dans les lignes

Je deviens fou mad

Hors ligne

#2 Le 22/11/2017, à 21:43

pingouinux

Re : problème avec script perso

Bonsoir,
Qu'essayes-tu de faire exactement. Ceci ?

#!/bin/bash
i=0

while read doublon
  do
        echo ""
        echo doublon : "$doublon"
        #grep -Fnh --color "$doublon" "$1"
        ((i++))

done < <(sort "$1" | uniq -d)

echo "nb de doublons : $i"

Hors ligne

#3 Le 22/11/2017, à 21:47

AGP-Architecture

Re : problème avec script perso

oui exactement .... big_smile tongue

mais est-ce que quelqu'un pourrais m'expliquer ce que je fais de mal dans mon code parce que j'ai vraiment du mal avec bash et ca syntaxe (je viens de C# et php).

Hors ligne

#4 Le 22/11/2017, à 22:01

pingouinux

Re : problème avec script perso

D'abord, tu récupérais toutes les lignes du fichier, en ne conservant qu'un seul exemplaire de chaque doublon. Il faut utiliser uniq -d pour n'avoir que les doublons.
Ensuite, tu lisais le fichier mot par mot.

C'est en pratiquant que tu finiras par maîtriser bash de mieux en mieux.

Hors ligne

#5 Le 22/11/2017, à 22:39

Hizoka

Re : problème avec script perso

Salut,
où apprends tu bash ?
car `` est déprécié depuis un moment au profit de $()

echo ""
echo doublon : "$doublon"
=>
echo -e "\ndoublon : $doublon"
ou
echo "
doublon : $doublon"

c'est plus lisible

let i=1+$i
=>
((i++))
ou
i+=1
ou
i=$((i+1))

Jette un oeil ici : https://abs.traduc.org/abs-fr/

attention à l'utilisation abuse de cat wink

et encadre autant que possible tes variables avec des ", car dans le cas de $1, s'il y a un espace, ça ne fonctionnera pas.

Amuse toi bien car c'est vraiment plaisant bash smile

Dernière modification par Hizoka (Le 22/11/2017, à 22:41)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#6 Le 23/11/2017, à 10:45

AGP-Architecture

Re : problème avec script perso

Hizoka a écrit :

où apprends tu bash ?

Un peu partout en fonction des résultats de google et qwant. Effectivement je cherche désespérément un très bon tuto sur bash. mais je vais aller voir ce que tu proposes.
Je regarde aussi des exemple de script pour voir comment le code est structuré, ...

Par contre j'ai vraiment du mal avec la syntaxe (déclaration variable sans $ et utilisation avec $) car on voit plusieurs manière de faire dans les différents tuto. Et en plus je pige pas trop quand je vois des choses comme $((<code>)),  parfois $VARIABLE et parfois $(VARIABLE), ...

Je pensais avoir plus de facilité en venant de php et C#. mais la syntaxe est vraiment très très différente

Est-ce quelqu'un pourrait quand même me montrer une variante du code de pingouinux mais avec l'utilisation d'un for à la place d'un while.

Merci beaucoup pour le partage.

Hors ligne

#7 Le 23/11/2017, à 10:59

LukePerp

Re : problème avec script perso

Une bible pour le bash :
http://tldp.org/LDP/abs/html/index.html


Desktop & Laptop - Ubuntu Mate dernière LTS - Intel i5 - 16 Go - Dual boot Windows offline

Hors ligne

#8 Le 23/11/2017, à 11:18

Hizoka

Re : problème avec script perso

LukePerp => Ma version fr commence à dater en effet smile

$VARIABLE et parfois $(VARIABLE)

Non... c'est entre {}
Interet ?

var="jo"
echo "Bon$varur"
=> Bon
echo "Bon${var}ur"
=> Bonjour

Perso j'ai pris l'habitude de toujours les mettre entre {} pour éviter tout probleme.

De même pour une liste/tableau tu es obligé d'utiliser les {}

x=(a b c d)
echo $x[2]
=> a[2]
echo ${x[2]}
=> c

$((code)) sert pour l'arithmétique.


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#9 Le 23/11/2017, à 19:10

AGP-Architecture

Re : problème avec script perso

bon je coince à nouveau sur le même script après juste une modification :

le script précédent fonctionne très bien mais j'ai voulu ajouter le fait qu'il n'affiche pas les ligne commançant par : # et afficher les lignes ou se situe les double dans le fichier de base.
J'ai donc adapté le script de la manière suivante :

#!/bin/bash

i=0

while read doublon
  do
      echo ""
      if [ "${doublon:0:1}" != '#' ]; then
           echo doublon : "$doublon"
           grep -n --color "$doublon" "$1"
           ((i++))
      fi
done < <(sort "$1" | uniq -d)

echo "nb de doublons : $i"

alors les erreurs sont :

1. le fichier est affiché complètement avant le traitement
2. certaine ligne n'affiche pas le résultat grep
3. j'ai énormément de nouvelle ligne.

exemple de résultat : les passages à la ligne sont non modifiés

*** Coupure du résultat pour lisibilité (affichage du fichier complet) ***

904:alias cp="cp -i"  # Confirmer avant d'écraser un fichier existant
905:alias df='df -h'  # Tailles lisibles par l'homme
906:alias free='free -m'  # voir la taille en MB
907:
908:
909:alias ports="lsof -i -n -P" # Voir les process qui utilisent une connection internet
910:alias estab="ss -p | grep STA" # Voir seulement les sockets établis 
911:alias netstat80="netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1" # nombre de connections sur le port 80 du serveur par IP    
912:alias openports="netstat -nape --inet" # Voir les ports ouverts
913:alias netpid="netstat -tlnp" # Voir le port qui écoute avec le PID du process associé
914:alias appson="netstat -lantp | grep -i stab | awk -F/ '{print $2}' | sort | uniq" # Voir une liste des noms de process qui utilisent une connection
915:alias rscp='rsync -aP --no-whole-file --inplace' # rsync cp // a(garder permissions) P(progress bar)
916:alias rsmv='rscp --remove-source-files' # rsync mv avec progressbar
917:alias calc='python -ic "from math import *; from random import *"' # Une calculatrice en python
918:alias servethis="python -m SimpleHTTPServer 8000" # Serveur python sur le port 8000
919:
920:
921:
922:alias reload_bash="source ~/.bashrc" # recharger le ~/.bashrc
923:alias ncmpc='ncmpc -c' # Ncurse mpc en couleur
924:alias psp='ps u -C' # ps sur un seul process
925:alias bind '"\C-l"':"\"clear\r\"" # Ctrl+l vide le terminal
926:






doublon : alias appson="netstat -lantp | grep -i stab | awk -F/ '{print $2}' | sort | uniq" # Voir une liste des noms de process qui utilisent une connection
683:alias appson="netstat -lantp | grep -i stab | awk -F/ '{print $2}' | sort | uniq" # Voir une liste des noms de process qui utilisent une connection
914:alias appson="netstat -lantp | grep -i stab | awk -F/ '{print $2}' | sort | uniq" # Voir une liste des noms de process qui utilisent une connection

doublon : alias bip='putty -load Nom &'
524:alias bip='putty -load Nom &'
544:alias bip='putty -load Nom &'
765:alias bip='putty -load Nom &'

*** Coupure du résultat pour lisibilité ***

doublon : alias log='tail -f /var/log/mail.log|ccze -A'
523:alias log='tail -f /var/log/mail.log|ccze -A'
764:alias log='tail -f /var/log/mail.log|ccze -A'

doublon : alias lr='ls -R | grep ":$" | sed -e '''s/:$//''' -e '''s/[^-][^/]*//--/g''' -e '''s/^/   /''' -e '''s/-/|/''''

doublon : alias lsd='ll | grep "^d"'
597:alias lsd='ll | grep "^d"'
834:alias lsd='ll | grep "^d"'

doublon : alias lsd='ls -d */'

doublon : alias lsd='ls -Gal | grep ^d' #Only list directories, including hidden ones
566:alias lsd='ls -Gal | grep ^d' #Only list directories, including hidden ones
806:alias lsd='ls -Gal | grep ^d' #Only list directories, including hidden ones

doublon : alias mkdir='mkdir -p'
482:alias mkdir='mkdir -p'
634:alias mkdir='mkdir -p'
724:alias mkdir='mkdir -p'
871:alias mkdir='mkdir -p'

doublon : alias mktar='tar -cvf'
474:alias mktar='tar -cvf'
626:alias mktar='tar -cvf'
716:alias mktar='tar -cvf'
863:alias mktar='tar -cvf'



doublon : alias up='sudo apt-get update && sudo apt-get upgrade'
63:#alias up='sudo apt-get update && sudo apt-get upgrade'
464:alias up='sudo apt-get update && sudo apt-get upgrade'
616:alias up='sudo apt-get update && sudo apt-get upgrade'
706:alias up='sudo apt-get update && sudo apt-get upgrade'

doublon : alias wanip='wget -q http://checkip.dyndns.org -O- | cut -d: -f2 | cut -d< -f1'









doublon : cut -d' ' -f1 | sort | uniq -c | sort -rg | head"
502:	cut -d' ' -f1 | sort | uniq -c | sort -rg | head"
654:	cut -d' ' -f1 | sort | uniq -c | sort -rg | head"
744:	cut -d' ' -f1 | sort | uniq -c | sort -rg | head"
890:alias topten="sed -e 's/^: [0-9]\{10\}:0;//' ~/.zshist | sed -e 's/sudo //' | \ cut -d' ' -f1 | sort | uniq -c | sort -rg | head"











nb de doublons : 121
##########################################################################################
agpadmin@agpadmin-VirtualBox:~/Documents$ 

moi le seul truc que je veux avec mon script c'est quelque chose  comme :

doublon : alias tx30='ifconfig wlan0 down;iw reg set BO;iwconfig wlan0 txpower 30'
551:alias tx30='ifconfig wlan0 down;iw reg set BO;iwconfig wlan0 txpower 30'
791:alias tx30='ifconfig wlan0 down;iw reg set BO;iwconfig wlan0 txpower 30'

doublon : alias tx='ifconfig wlan0 down;iw reg set BO;iwconfig wlan0 txpower 27'
548:alias tx='ifconfig wlan0 down;iw reg set BO;iwconfig wlan0 txpower 27'
788:alias tx='ifconfig wlan0 down;iw reg set BO;iwconfig wlan0 txpower 27'

doublon : alias untar='tar -xvf'
475:alias untar='tar -xvf'
627:alias untar='tar -xvf'
717:alias untar='tar -xvf'
864:alias untar='tar -xvf'

doublon : alias update='sudo apt-get update'
588:alias update='sudo apt-get update'
825:alias update='sudo apt-get update'

Hors ligne

#10 Le 23/11/2017, à 19:34

pingouinux

Re : problème avec script perso

Les lignes vides sont évidemment considérées comme des doublons.

Ajouté :
C'est à cause de ces lignes vides que le fichier sort en entier.

grep '' fichier

sort le fichier complet.

Ajouté (2) :
Tu peux essayer ceci

#!/bin/bash

i=0

while read doublon
  do
      echo ""
      echo doublon : "$doublon"
      grep -n --color "^$doublon$" "$1" 
      ((i++))

done < <(sed '/^#/d;/^ *$/d' "$1" | sort | uniq -d)

echo "nb de doublons : $i"

Dernière modification par pingouinux (Le 23/11/2017, à 20:28)

Hors ligne