AWK – remplacement de caractères et parser des fichiers
La commande awk permet d’effectuer des traitements sur des chaines de caractères ou des fichiers en se basant sur des modèles et un langage propre, ainsi que l’utilisation d’expressions rationnelles.
Premier exemple, parser une ligne contenant des termes séparés par un espace (tout se passe dans un terminal sous GNU/Linux of course) :
On charge une variable avec ces 3 mots :
[bash]ligne="mot1 mot2 mot3"[/bash]
Puis on veut extraire le premier mot :
[bash]echo $ligne|awk -F " " ‘{print $1}'[/bash]
ou extraire le premier et le troisieme :
[bash]echo $ligne|awk -F " " ‘{print $1 $3}'[/bash]
On notera qu’ici -F permet de définir le séparateur de champs, puis, la commande « print » permet d’afficher la valeur contenue dans le champs choisi (indexé de 1 à n). L’index « 0 » comme en bash, représente l’ensemble de la chaine originale passée en argument.
AWK permet également des traitements sur les chaines de caractères, afin par exemple d’opérer un remplacement basé sur un modèle.
On charge une variable avec une chaine :
[bash]ligne="le chien est noir,le chat est gris"[/bash]
Et on va changer la couleur du chien et ne garder que le chien :
[bash]echo $ligne|awk -F "," ‘{gsub("noir","blanc",$1);print $1}'[/bash]
Ceci va afficher « Le chien est blanc ». Comme vu plus haut, le -F permet de casser la chaine sur toutes les virgules rencontrées, chaque élément est accessible via l’index en variable ($1 ou $2 ici). Puis, la commande gsub (substitution) permet de remplacer toute valeur « noir » par « blanc », dans la variable $1 (soit la partie avant la virgule).
La commande gsub s’est donc appliquée à $1, l’instruction print est indépendante, on aurait pu taper:
[bash]echo $ligne|awk -F "," ‘{gsub("noir","blanc",$1);print $1","$2}'[/bash]
afin d’afficher la partie modifiée et la seconde non modifiée.
Jusqu’ici nous avons travaillé sur des variables, mais awk permet de travailler sur des fichiers pour un traitement rapide.
Prenons le fichier /etc/passwd qui contient des éléments de ce type : root:x:0:0:root:/root:/bin/bash
Nous souhaitons par exemple afficher une liste des utilisateurs existants, leur home, et le shell associé. On constate donc que le « : » peut être utilisé comme séparateur.
Nous allons donc afficher le listing voulu de la manière suivante (login => home => shell) :
[bash]awk -F "\:" ‘{print $1" => "$6" => "$7}’ /etc/passwd[/bash]
Dans ce dernier point, nous avons parsé directement un fichier, et affiché le résultat dans la console. Il est possible de renvoyer le résultat dans un fichier avec une simple redirection :
[bash]awk -F "\:" ‘{print $1" => "$6" => "$7}’ /etc/passwd > mon_listing.txt[/bash]
Vous pouvez utiliser différents caractères spéciaux codés de la manière suivante :
\\ Un antislash.
\b retour arriere (backspace).
\n nouvelle ligne.
\r retour chariot.
\t tabulation horizontale.
\v tabulation verticale.
De manière générale les caractères spéciaux (* % etc.) doivent être « échappés » par un antislash.
On peut également utiliser les expressions régulières (ou rationnelles) afin de définir un séparateur.
[bash]awk -F "[^a-z|^A-Z|^0-9|^–|^/|^,]" ‘{print $1" => "$2" => "$3" => "$4" => "$5" => "$6" => "$7}’ /etc/passwd[/bash]
Dans l’exemple ci dessus, on va lire le fichier /etc/passwd on utilisant comme séparateur de champs l’expression rationnelle suivante :
[bash][^a-z|^A-Z|^0-9|^–|^/|^,][/bash]
Celle ci signifie que sera considéré comme séparateur de champs tout caractère qui n’est pas alphanumérique en majuscule ou minuscule, et différent de -, de / et de ,.
Plus d’informations sur les expressions rationnelles : http://fr.wikipedia.org/wiki/Expression_rationnelle
Dernier exemple, on va passer une chaine en majuscule avec la fonction « toupper » (il existe aussi tolower pour l’inverse):
[bash]echo "Coucou comment ça va?"|awk ‘{print toupper($0)}'[/bash]
Pour plus d’informations, man awk
![]()
Cle 3G Huawei E1552 sur Ubuntu Lucid
Mise à jour : Suite à différents essais, la modification proposée engendrait un blocage du montage des disques dur USB. Du coup après un échange avec l’auteur de l’astuce cité en source, voici la solution simple (en lieu et place de la solution manuelle donnée) :
[bash]sudo apt-get install usb-modeswitch[/bash]
Voilà, tout fonctionne :D Je laisse le post original ci dessous pour l’aspect didactique :
La clé 3G Huawei E1552 fonctionne très bien sous Ubuntu Lucid Lynx mais pas automatiquement.
Pour que votre système Ubuntu la reconnaisse, il faut appliquer une très simple modification comme suit :
Créer un fichier (règle Udev) /etc/udev/rules.d/60-huawei-usb-3g-modem.rules qui contient les lignes suivantes :
[bash]SUBSYSTEM=="usb",
ATTR{idVendor}=="12d1",
ATTR{idProduct}=="1446",
RUN+="/lib/udev/modem-modeswitch -v 0x%s{idVendor} -p 0x%s{idProduct} -t option-zerocd"[/bash]
Puis relancer le service udev :
[bash]sudo service udev restart[/bash]
Maintenant, il suffit de brancher la clé 3G sur l’usb, et elle devrait être reconnue. Dans mon cas, un clic droit sur les connexions réseau dans la barre d’outil gnome m’a permis de parametrer ma connexion 3G et d’établir la connexion.
Sinon comme indiqué sur le site source, par le menu « Système > Preferences > Connections réseau > Connexions mobiles à large bande », vous pouvez configurer votre connexion.
Source : http://blog.qedx.com/2010/07/huawei-e1552-on-ubuntu-lucid.html
![]()
Ubuntu – bloquer la mise à jour d’un paquet
Après avoir installé un paquet d’une version spécifique, il peut être intéressant d’en bloquer la mise à jour automatique.
Pour cela, il suffit d’ajouter dans le fichier /etc/apt/preferences (le créer si il n’existe pas) les lignes suivantes :
[bash]Package: nom_du_paquet
Pin: version du paquet à conserver
Pin-priority: 1001[/bash]
Ce qui donne par exemple pour gthumb (purement dans un but didactique) :
[bash]Package: gthumb
Pin: version 3:2.11.2.1.is.2.10.11-0ubuntu1
Pin-priority: 1001[/bash]
On notera que le numéro de version à indiquer est l’information que l’on obtient en listant le paquet actuellement installé avec la commande « dpkg -l », par exemple :
[bash]dpkg -l |grep gthumb[/bash]
Le résultat se situe dans la deuxième colonne.
Si vous ne respectez pas exactement le bon No de version, ça ne fonctionnera pas, et votre programme risque d’être mis à jour.
Vous pouvez vérifier la bonne prise en compte avec la commande :
[bash]sudo apt-cache policy gthumb[/bash]
Si tout est ok, lors de mise à jour du système par la commande « apt-get upgrade », le paquet sera ignoré, et par l’interface graphique, le paquet sera décoché par défaut.
Sources :
http://doc.ubuntu-fr.org/apt-get#bloquer_la_mise_a_jour_d_un_paquet
http://doc.ubuntu-fr.org/amarok
![]()
Pages
- À propos
- Alexandre Blanc Experience or work background
- Connected=hacked, cloud=leak, why
- Keeping track for my speaking events / appearances
- My take on Zero Trust – SP 800-207
- Openvpn and pihole on OVH VPS Server FAQ
- Raspberry 3 router project FAQ
- Spotting LinkedIn fake profiles, the tail of industrial spying, should I trust this contact ?
Search this Site
Archive
- août 2026
- avril 2025
- juin 2024
- mai 2024
- mars 2024
- février 2022
- janvier 2022
- octobre 2021
- septembre 2021
- mai 2021
- octobre 2020
- juin 2020
- avril 2020
- avril 2019
- janvier 2019
- juin 2018
- mars 2017
- octobre 2016
- août 2016
- mai 2016
- septembre 2015
- mai 2015
- février 2015
- novembre 2014
- septembre 2014
- août 2014
- janvier 2013
- décembre 2012
- juillet 2012
- janvier 2012
- novembre 2011
- octobre 2011
- mai 2011
- avril 2011
- mars 2011
- février 2011
- janvier 2011
- décembre 2010
- novembre 2010
- octobre 2010
- septembre 2010