Skip to content

Linux Attitude

Le libre est un état d'esprit

Archive

Archive for July, 2007

Niveau :      
Résumé : wc ; grep ; tac ; rev

Compter les lignes sans avoir le nom de fichier en sortie :

$ wc -l < file

Récupérer les 3 lignes derrière une expression régulière :

$ grep -A3 "^#"

Récupérer les 3 lignes précédant une expression régulière :

$ grep -B3 "---"

Récupérer toutes les lignes entre 2 expressions régulières :

$ sed -n '/Location/,//Location/p'

Afficher un fichier en commençant par la dernière ligne :

$ tac fichier

Afficher un fichier en en commençant par la fin de chaque ligne

$ rev fichier

Grepper des lignes sur un critère numérique

$ grep "^([0-9]|[0-9]{2}|1([01][0-9]|2[012])) " file # difficile (0 à 122)
$ while read a b; do [ $a -lt 123 ] && echo "$a $b"; done < file # facile (0 à 122)

Niveau :      
Résumé : sed

Dans un récent article, je vous conseillais d'utiliser perl pour ne pas avoir à apprendre la syntaxe des autres outils. Oui, mais sed est bien supérieur à perl dans certains cas particuliers. Par conséquent il est tout de même bon de connaître quelques idiomes sed.

Ceci est une sélection d'unilignes en provenance de http://sed.sourceforge.net/sed1line.txt

Cherchez les équivalents perl, vous constaterez qu'ils sont souvent plus long si ce n'est plus lent.

Commençons par ceux qui vous seront le plus souvent utiles :

# remplace toto par tata dans toutes les lignes contenant titi
$ sed '/titi/s/toto/tata/g'

# remplace toto par tata dans toutes les lignes ne contenant pas titi
$ sed '/titi/!s/toto/tata/g'

# imprime les 10 premières lignes, comme le ferait head (utile pour comprendre la suite)
$ sed 10q

# imprimes toutes les lignes sauf celles entre "tata" et "toto"
$ sed '/tata/,/toto/d'

# imprime la ligne 52
$ sed -n '52p'                 # méthode 1
$ sed '52!d'                   # méthode 2
$ sed '52q;d'                  # méthode 3, arrête la lecture dès qu'elle a matché (pour la vitesse)

# supprime les 10 premières lignes
$ sed '1,10d'

# imprime les 10 dernières lignes, comme le ferait tail (plus difficile)
$ sed -e :a -e '$q;N;11,$D;ba'

continue reading...

Niveau :      
Résumé : file -skz ; wget -c ; stat ; ...

Détecter automatiquement le type d'un fichier :

# en ligne de commande
# fonctionne avec les fichiers spéciaux, trouve tous les types possibles, lit les fichiers compressés
$ file -skz file

# pour un script
# n'affiche pas le nom du fichier
$ file -b file

Récupérer un téléchargement déjà bien entamé (fonctionne en ftp et en http lorsque le serveur le supporte) :

$ wget -c http://toto.fr

Récupérer différents attributs d'un fichier :

$ stat -c "%a" file # droits
$ stat -c "%U:%G" file # propriétaire:groupe
$ stat -c "%x" file # dernier accès

Trouver les 10 lignes les plus répétées dans un fichier :

$ sort | uniq -c | sort -nr | head

Alerter par un beep quand une commande se termine :

$ ./mycommand ; echo -ne "\a"

Avertir quand une commande s'est mal terminée :

$ ./mycommand || echo "Erreur"

Avertir quand une commande s'est bien terminée :

$ ./mycommand && echo "No problemo"

Les 2 à la fois (attention à l'ordre)

$ ./mycommand && echo "No problemo" || echo "Erreur"

Niveau :      
Résumé : use Inline C;

Vous aimez les scripts, mais vous êtes un inconditionnel du C ?

D'un côté le C c'est beau, c'est artistique, c'est roots ... D'un autre coté, un code en C doit être compilé, on doit fournir les sources et de préférence un makefile, il nécessite un peu de connaissances. Résultat personne ne modifie jamais votre code.

Mais la solution miracle est sous votre nez. Le script en C ! Vous distribuez uniquement le source et il est exécutable et modifiable en live.

Attention, il vous faut le module CPAN Inline::C. Moteur ! Action !

Fichier test1.c :

#!/usr/bin/perl
use Inline C;
exit main0();
__END__
__C__
#include <stdio.h>

int main0()
{
   printf("Hello world !\n");
   return 0;
}

On le lance :

$ chmod +x test1.c
$ ./test1.c
> Hello world !

Mieux, vous pouvez vous appuyer sur perl pour les trucs un peu lourds comme le parsing des options.

Fichier test2.c :

#!/usr/bin/perl
use Inline C;
$arg = $ARGV[0];
$arg = tr/[a-z]/[A-Z]/; # modification du paramètre
exit main0($arg);
__END__
__C__
#include <stdio.h>

int main0(char *arg1)
{
   printf("Hello %s \n",arg1);
   return 0;
}

Niveau :      
Résumé : ./ies4linux ; ie5, ie5.5, ie6, ie7

Aujourd'hui on va faire dans le simple (pour moi) mais indispensable (pour vous). Comme beaucoup de monde, je parie que vous vous faites un petit site web dans votre coin. Le problème c'est que cet *$%§ de IE n'interprète pas les CSS comme l'indispensable génalissime firefox (non non, pas de parti pris ;)

Comme bien sûr vous êtes sous linux, et que vous développez probablement avec firefox vous ne détectez que tardivement les différences de police, de pixel ... Heureusement, la communauté vient à votre secours. Tout est tellement automatisé que je n'ai même rien à écrire. Suivons le lien : http://www.tatanka.com.br/ies4linux/page/Fr/Installation

En résumé, si vous avez déjà un wine qui tourne et que vous n'aimez pas lire :

$ wget http://www.tatanka.com.br/ies4linux/downloads/ies4linux-latest.tar.gz
$ tar zxvf ies4linux-latest.tar.gz
$ cd ies4linux-*
$ ./ies4linux

On peut installer ie4, ie5, ie5.5, ie6 et ie7 et le plugin flash est même supporté !

Le tout est installé dans votre home. Donc vous pouvez le lancer sur un compte d'entreprise ou d'université et vous n'avez pas à avoir peur d'éventuels problèmes liés à un script ayant un accès root.

Une icône est créée automatiquement, et si vous voulez pouvoir lancer IE en ligne de commande (commande ie6 par exemple), ajoutez /.bashrc ajoutez :

PATH=$PATH:~/bin

Et voilà, à vous de développer des sites qui fonctionnent pour tout le monde !

Niveau :      
Résumé : inotifywait -m

Vous avez un noyau 2.6, si l'option inotify a été activée alors vous avez entre les mains un outil bien pratique pour savoir ce qui se passe sur votre système de fichier.

Le paquet inotify-tools contient 2 commandes : inotifywait et inotifywatch. Ces commandes permettent de monitorer des évènements sur le système de fichier. Inotifywatch ne sert qu'aux statistiques tandis que inotifywait permet d'avoir les évènements exacts qui se sont produits.

Inotifywatch peut servir à détecter les causes de certains problèmes de performance. Par exemple avec la commande suivante, vous saurez quels sont les fichiers très fréquemment lus par votre serveur web et donc quelles sont les lectures à optimiser ou à mettre en cache.

$ inotifywatch -t 600 -r /var/www

Attention, il se peut que vous atteigniez rapidement le nombre maximum de fichier à surveiller à cause de la récursivité. Pour changer cette limite écrivez le maximum désiré dans /proc/sys/fs/inotify/max_user_watches

La commande inotifywait, elle, écoute les évènements et les affiche au fur et à mesure. Pour écouter en continu tous les évènements sur un fichier donné :

$ inotifywait -m /tmp/toto.txt

Grâce à ce petit outil nous pouvons écrire un démon pour recopier automatiquement un fichier dans un autre répertoire à chaque fois qu'un nouveau fichier est ajouté ou modifié dans un premier répertoire. C'est une forme de backup instantané qui vous protège des suppressions.

$ inotifywait -e modify,create --format "%w%f" -q -m /chemin | xargs -n 1 -I{} rsync {} /backup/

Mais je suis sûr que vous trouverez des utilisations bien plus intéressantes à ce petit outil.

Niveau :      
Résumé : bootchart

Vous savez sûrement comment fonctionne le processus de boot. Mais savez-vous exactement combien de temps prend chacune des étapes ? Je parie que non. Sachez qu'il existe tout ce qu'il faut pour le découvrir. Il vous faut le paquet bootchartd (ainsi que bootchart pour la suite).

Compilez, installez, apétez, c'est presque prêt. Il ne vous reste plus qu'une chose à faire, remplacer init par bootchartd. Pour cela modifiez la configuration de votre bootloader, grub ou lilo. Pour cela ajoutez l'option init=/sbin/bootchartd à votre noyau. N'oubliez pas de relancer lilo si c'est votre bootloader.

À votre prochain boot, bootchartd lancera l'init puis les temps de démarrage seront enregistrés automatiquement dans /var/log/bootchart.tgz

Vous avez rebooté, il est temps maintenant de lire ces données. Mettez-vous dans le répertoire où vous voulez enregistrer votre image et tapez simplement

$ bootchart

Et voila, un beau bootchart.png tout neuf est disponible. Ouvrez le avec votre visualisateur favori (attention, il est particulièrement grand).

D'abord sachons discerner les éléments qui ralentissent le démarrage. Il y en a deux catégories, ceux qui consomment des ressources et ceux qui empêchent l'exécution de la suite. Les premiers sont en couleur sur le graphe. Le seul moyen de les accélérer c'est de ne pas les lancer ;-) En gros on repère ce qui n'est plus vraiment utile et on vire.

Pour les éléments de la 2e catégorie, il peut y avoir une solution plus raisonnable. Un certain nombre de scripts d'init peut être lancé en arrière plan plutôt qu'en avant plan, ce qui leur supprime leur côté bloquant. Pour cela relisez simplement un article récent sur le lancement de script en arrière plan.

Et enfin, j'imagine que ce qui vous intéresse c'est le login graphique (kdm ou gdm). Vous pouvez alors simplement simplement avancer le chargement de *dm dans le processus d'init pour gagner un temps fou. Allez dans /etc/rcX.d (X étant déterminé avec la commande runlevel) puis changez le S99kdm en S40kdm par exemple.

Une dernière chose pour vraiment gagner du temps, il faut passer à un système de boot par dépendances (ou par évènements, c'est un peu la même chose). Pour cela regardez par exemple du coté d'upstart (installé chez ubuntu).