Voilà moi je vais vous présenter brièvement (Edit : en fait courage jusqu'à la fin lol) la commande (et language) AWK, qui est vraiment très utile en script, soit en commande simple afin de répéter un traitement. J'ai trouvé ça plus difficile à développer que du perl au départ, mais en seulement 1 ligne on peut faire pas mal de choses (la syntaxe est juste un peu sensible ^^).
Le principe :En gros dans awk ou gawk (awk avec des extensions gnu) vous devez définir :
- ce que vous allez mettre en entrée, un fichier texte par exemple
- un caractère qui séparera vos lignes en plusieurs champs (si besoin)
- la plupart du temps un motif (ou expression régulière quoi) à rechercher dans les lignes
- et un traitement à effectuer sur les lignes
Ce qui se passe :- AWK va parcourir les lignes de votre fichier une à une
- si vous avez défini un motif il traitera uniquement les lignes comportant ce motif (un peu comme un grep), sinon il traitera toutes les lignes
Les types de traitements que j'ai trouvé bien pratiques :- le simple print qui va vous permettre en sortie d'afficher les lignes qui correspondent à votre motif ou
juste certains champs de ces lignes
- l'appel d'une fonction système, d'une commande, ou d'un script
Voici différents liens assez intéressants ou vous pourrez appréhender la syntaxe en question.- Avec en priorité le man en français :
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man1/gawk.1.html- 2 petits tutos en français dont le 1er assez complet :
http://www.info.univ-angers.fr/aides/tutawk.htmlhttp://www.ac-creteil.fr/reseaux/systemes/linux/shell-scripts/gawk.html- et pour les plus courageux (ou alors les maso c'est au choix), les 2 violent pdf :
http://ploug.eu.org/doc/principe-awk-lacroix.pdfhttp://www.linuxfranch-county.org/docs/guideLLLinux/commandes_recherche_3-2.pdfVoilà maintenant des petits scripts de
ma composition on sait jamais ça pourra peut-être vous servir (c'est presque tout pompé du net hein lol) :
Précision pour les scripts ou les appels de commandes avec awk, je vous conseille fortement d'utiliser le chemin complet vers votre commande, j'ai eu pas mal de surprises avant de faire ça ^_^
#je veux créer un fichier texte (listeusers) comptenant la liste des utilisateurs samba d'un vieux serveur pour pouvoir les migrer sur un nouveau, ou simplement ajouter des users supplémentaires sur un serveur. (
le tout en glandant)
#je me sers du fichier smbpasswd du vieux serveur, voici une entrée type d'un fichier smbpasswd :
bidon:518:DEB252F0E698B5ACAAD3B435B51404EE:AFFED2E77EA990FE06AAAF0BF81885E5:[U ]:LCT-4649AAC1:#j'utilise cette commande
cat /etc/samba/smbpasswd | gawk -F":" '{ print $1 ";" }' > /home/guilhem/listeusers#détail de la commande :
#
cat /etc/samba/smbpasswd => c'est l'entrée que j'envoie à awk
#
-F":" => je défini que chaque ligne sera partagée en différents champs séparés par des ":" en effet ici le champ 1 sera le username et le champ 2 sera l'UID par exemple.
#
'{ print $1 ";" }' => c'est l'action qui sera effectuée pour chaque ligne, ici afficher le 1er champ ($1) et ajouter ";" a la suite. (à noter que $0 symbolise la ligne entière)
#
/home/guilhem/listeusers => j'envoie la sortie de ma commande vers le fichier listeusers
#si j'ai que bidon comme user samba, si on cat listeusers on aura ça :
bidon;#j'ai rajouté un ; a la suite afin de pouvoir éditer le fichier et y rajouter le futur password du user, par exemple :
bidon;creufop2006#je veux créer des users unix (destinés à samba) qui se trouveront dans mon fichier listeusers, mais sans leur permettre de se loguer sur la machine.
gawk -F";" '{ system("/usr/sbin/adduser -s /bin/false "$1) }' /home/guilhem/listeusers#remarquez ici la 2 ème façon de donner l'entrée au awk, au lieu de piper un cat je donne juste le fichier à analiser en paramètre (cf man)
#pour chaque ligne de mon fichier listeuser le awk va appeler la commande adduser.
#je veux ensuite créer les comptes samba pour tous ces users
gawk -F";" '{ system("/bin/echo -e \""$2"\n"$2"\" | /usr/bin/smbpasswd -a -s "$1) }' /home/guilhem/listeusers#ici un peu plus compliqué car je veux définir les mots de passe dans samba, et pour le faire de façon scriptée il faut utiliser
smbpasswd -s, c'est à dire que la commande prend les mots de passes depuis l'entrée standard (donc par mon pipe) au lieu de les demander en mode intéractif
#le
echo -e sert à interpréter certains caractères spéciaux comme ici
\n le passage à la ligne suivante (notez que le password que je donne par le pipe c'est la valeur de
$2 puis on va à la ligne comme si on tapait "entrée" puis de nouveau
$2, car smbpasswd demande la confirmation du password).
#Si vous avez compris à peu près les 2 dernière commandes voilà ce que j'ai utilisé par la suite, c'est les 2 commandes en 1 seule :
gawk -F";" '{ system("/usr/sbin/adduser -s /bin/false "$1); system("/bin/echo -e \""$2"\n"$2"\" | /usr/bin/smbpasswd -a -s "$1) }' /home/guilhem/listeusers#rien de vraiment plus compliquer, vous pouvez enchainer des commandes en intercallant un ; quoi)
Voilà n'hésitez pas à poster des questions si je peux j'y répondrai et puis pour les fautes d'orthographe gumenasai !