Pages : 1
#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
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 ....
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
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
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
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
Gamer inside - Ubuntu Mate dernière LTS - Intel i5, 16 Go - Dual boot Windows - Utilisateur de Dapps sur Ethereum
Hors ligne
#8 Le 23/11/2017, à 11:18
- Hizoka
Re : problème avec script perso
LukePerp => Ma version fr commence à dater en effet
$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