#1 Le 22/09/2008, à 22:58
- yurek
compresser au maximum une commande récurrente
j'essaye de retomber sur la bonne syntaxe de la version du kernel.
Le chiffre de départ est
VERSION_KERNEL_HASH=`uname -r | sed s"/[a-z]\|-\|\.//g"`
Puis on reconvertit :
echo VERSION_KERNEL_HASH | sed s"/./&./"| sed s"/.../&./"| sed s"/....../&-/"
Comment obtenir la meme chose en une commande sed ?
Dernière modification par yurek (Le 22/09/2008, à 23:00)
http://doc.ubuntu-fr.org/installation/debutants
http://doc.ubuntu-fr.org/diagnostic
http://doc.ubuntu-fr.org/diagnostic_outils
http://doc.ubuntu-fr.org/reflexe_ubunteros
Hors ligne
#2 Le 22/09/2008, à 23:00
- yurek
Re : compresser au maximum une commande récurrente
La meme demande pour grep
grep -v $VERSION_KERNEL | grep -v $CONSERV
http://doc.ubuntu-fr.org/installation/debutants
http://doc.ubuntu-fr.org/diagnostic
http://doc.ubuntu-fr.org/diagnostic_outils
http://doc.ubuntu-fr.org/reflexe_ubunteros
Hors ligne
#3 Le 23/09/2008, à 10:18
- tiky
Re : compresser au maximum une commande récurrente
Pour la première commande:
echo VERSION_KERNEL_HASH | sed -e s"/^\([0-2]\)\([0-9]\)\([0-9]\{1\,2\}\)\([0-9]\)/\1.\2.\3-\4/"
Pour le deuxième ce n'est pas possible, bien que grep supporte les expressions relationnelles à travers l'option -e, il ne supporte pas les caractères opérations étendues comme |. On ne peut donc pas proposer plusieurs alternatives. La solution c'est d'utiliser awk à la place.
Dernière modification par tiky (Le 23/09/2008, à 10:29)
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#4 Le 23/09/2008, à 11:20
- yurek
Re : compresser au maximum une commande récurrente
Je connais pas awk , comment on pourrait faire le sed est trop long je trouve. ( et trop compliqué )
Merci
http://doc.ubuntu-fr.org/installation/debutants
http://doc.ubuntu-fr.org/diagnostic
http://doc.ubuntu-fr.org/diagnostic_outils
http://doc.ubuntu-fr.org/reflexe_ubunteros
Hors ligne
#5 Le 23/09/2008, à 11:56
- Totor
Re : compresser au maximum une commande récurrente
Salut,
Pour la première commande:
echo VERSION_KERNEL_HASH | sed -e s"/^\([0-2]\)\([0-9]\)\([0-9]\{1\,2\}\)\([0-9]\)/\1.\2.\3-\4/"
Pour le deuxième ce n'est pas possible, bien que grep supporte les expressions relationnelles à travers l'option -e, il ne supporte pas les caractères opérations étendues comme |. On ne peut donc pas proposer plusieurs alternatives. La solution c'est d'utiliser awk à la place.
Si, grep le permet :
>echo -e "1\n2\n3"|grep -E '1|3'
1
3
>echo -e "1\n2\n3"|grep '1\|3'
1
3
et pour le problème initial, ceci devrait faire l'affaire:
uname -r|sed 's/\.[a-zA-Z]*$//'
EDIT : je ne sais pas s'il est possible qu'il y est des chiffres dans le nom/type mais si c'est le cas il est préférable d'utiliser ceci :
uname -r|sed 's/^\([.0-9-]*\)*\..*$/\1/'
Dernière modification par Totor (Le 23/09/2008, à 12:10)
-- Lucid Lynx --
Hors ligne
#6 Le 23/09/2008, à 12:04
- tiky
Re : compresser au maximum une commande récurrente
Ta commande sed ne fonctionne pas avec toutes les versions du Kernel, le nombre de chiffre est variable, tu peux avoir:
2.6.3
2.6.3-4
2.6.10
2.6.10-4
...
Voilà un sed plus court mais moins stricte...
echo VERSION_KERNEL_HASH | sed -e s"/^\(.\)\(.\)\([0-9]\{1,2\}\)\(.\)$/\1.\2.\3-\4/"
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#7 Le 23/09/2008, à 12:31
- tiky
Re : compresser au maximum une commande récurrente
Effectivement je ne connaissais pas l'option -E ( extended-regexp ), très pratique, merci
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#8 Le 23/09/2008, à 23:07
- yurek
Re : compresser au maximum une commande récurrente
merci
http://doc.ubuntu-fr.org/installation/debutants
http://doc.ubuntu-fr.org/diagnostic
http://doc.ubuntu-fr.org/diagnostic_outils
http://doc.ubuntu-fr.org/reflexe_ubunteros
Hors ligne
#9 Le 24/09/2008, à 09:43
- Alain.g
Re : compresser au maximum une commande récurrente
Effectivement je ne connaissais pas l'option -E ( extended-regexp )
C'est plus connu sous le nom egrep
Xubuntu Karmic !
Hors ligne
#10 Le 24/09/2008, à 10:37
- tiky
Re : compresser au maximum une commande récurrente
Oui je connais egrep, enfin je m'en suis pas servi jusqu'à présent, merci
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#11 Le 06/10/2008, à 16:17
- yurek
Re : compresser au maximum une commande récurrente
Je voudrais vérifier une IP
cat s | egrep [0-9][.]| sed -e s"/^[0-9].\.[0-9].\.[0-9].\./&/g"
82.64.71.226
82.64.71.226
4482.2264.71.226
Comment supprimer la dernière ligne qui n'est pas conforme a une adresse IP ?
Possible de compacter le sed ?
Possible d'ajouter la vérification une IP va de 0.0.0.0 a 255.255.255.255 donc si un groupe est supérieur a 255 on l'élimine ?
Merci.
Dernière modification par yurek (Le 06/10/2008, à 16:18)
http://doc.ubuntu-fr.org/installation/debutants
http://doc.ubuntu-fr.org/diagnostic
http://doc.ubuntu-fr.org/diagnostic_outils
http://doc.ubuntu-fr.org/reflexe_ubunteros
Hors ligne
#12 Le 06/10/2008, à 18:05
- tiky
Re : compresser au maximum une commande récurrente
Un peu mieux:
cat s | egrep '^([0-9]{1,3}\.){3}[0-9]{1,3}$'
Trouve toutes les chaînes de la forme:
0.0.0.0 à 999.999.999.999
Et plus besoin de sed. ( Tu peux aussi mettre sed à la place mais il faut utiliser des \ devant les ( et les { ).
Dernière modification par tiky (Le 06/10/2008, à 18:08)
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#13 Le 06/10/2008, à 18:06
- Alain.g
Re : compresser au maximum une commande récurrente
Possible d'ajouter la vérification une IP va de 0.0.0.0 a 255.255.255.255
Oui, il faut utiliser l'opérateur de choix (|) pour y aller petit à petit :
on couvre les nombres de 0 à 199 : [0-1]?[0-9][0-9]?
de 200 à 249 : 2[0-4][0-9]
et de 250 à 255 : 25[0-5]
On met tout à la suite en séparant par | pour spécifier qu'il faut que ça corresponde à un de ces trois cas là.
Exemple concret :
verif_ip () {
if echo "$1" | egrep -q '^(([0-1]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}([0-1]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])$'
then echo "$1 = IP valide"
else echo "$1 = IP non valide"
fi
}
verif_ip 82.64.71.226
verif_ip 4482.2264.71.226
si c'est du bash, il est possible d'utiliser la commande de test étendue [[ (plus rapide que echo|grep -q)
#!/bin/bash
verif_ip () {
if [[ "$1" =~ ^(([0-1]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}([0-1]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])$ ]]
then echo "$1 = IP valide"
else echo "$1 = IP non valide"
fi
}
verif_ip 82.64.71.226
verif_ip 4482.2264.71.226
Dernière modification par Alain.g (Le 06/10/2008, à 18:13)
Xubuntu Karmic !
Hors ligne
#14 Le 06/10/2008, à 18:52
- Alain.g
Re : compresser au maximum une commande récurrente
Je ne sais pas si ça vaut le coup de le signaler, mais on peut faire plus court avec pcregrep (pas installé d'origine mais dans les dépôts) :
verif_ip () {
if echo "$1" | pcregrep -q '^(([0-1]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\.(?!$)|$)){4}'
then echo "$1 = IP valide"
else echo "$1 = IP non valide"
fi
}
Xubuntu Karmic !
Hors ligne
#15 Le 06/10/2008, à 20:02
- yurek
Re : compresser au maximum une commande récurrente
MERCI, mais je comprends pas les commandes une petites explications ?
http://doc.ubuntu-fr.org/installation/debutants
http://doc.ubuntu-fr.org/diagnostic
http://doc.ubuntu-fr.org/diagnostic_outils
http://doc.ubuntu-fr.org/reflexe_ubunteros
Hors ligne
#16 Le 06/10/2008, à 21:48
- Link31
Re : compresser au maximum une commande récurrente
Si le but est de faire court...
a() { pcregrep -q '^(([0-1]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\.(?!$)|$)){4}' <<< $1 && echo "$1 = IP valide" || echo "$1 = IP non valide"; }
a 82.64.71.226
Hors ligne
#17 Le 06/10/2008, à 22:17
- Alain.g
Re : compresser au maximum une commande récurrente
Si le but est de faire court, tu peux gagner 10 caractères en remplaçant les [0-9] par \d et le [0-1] par [01]
pcregrep -q '^(([01]?\d\d?|2[0-4]\d|25[0-5])(\.(?!$)|$)){4}'
Xubuntu Karmic !
Hors ligne