Aide mémoire Shell

Commandes shell usuelles (ou un peu moins) avec cas d’usage.

Attention : Je rappelle qu’au quotidien je manipule des systèmes Lignux. Si je ne l’ai pas marqué explicitement, je n’ai pas testé sur un système UNIX.

awk

La commande à maintenant sa page dédiée ici.

cp

Pour sauvegarder un dossier en conservant ses attributs :

cp -avr <origine> <destination>

Remarque : cette commande est utile pour une copie temporaire en vue de faire un éventuel retour arrière. Pour une sauvegarde régulière et plus poussée il vaut mieux se tourner vers des outils comme rsync.

find

Pour rechercher un motif dans un ensemble de fichiers, il est possible d’utiliser grep à l’aide de l’argument exec

find <chemin> -name "<fichiers>" -exec grep "<motif>" {} \; -print

La sortie produite ressemblera à

contenu éventuel du grep sur fichier 1
fichier 1 correspondant à -name
fichier 2 correspondant à -name
contenu éventuel du grep sur fichier 3
fichier 3 correspondant à -name
fichier 4 correspondant à -name
contenu éventuel du grep sur fichier N
fichier N correspondant à -name
etc ...

En plaçant l’argument print avant exec, la logique d’affichage s’inverse : d’abord afficher le nom des fichiers puis le contenu éventuel.

ATTENTION Comme il est possible de lancer n’importe quelle commande avec exec, il faut absolument être sûr des fichiers sur lesquels on veut agir. Pour cela il faut utiliser -ls en tout premier essai.

find <chemin> -name "<fichiers>" -ls

Il vaut mieux perdre quelques dizaines de minutes à relire une liste de fichiers que de perdre des heures ou des jours à restaurer une sauvegarde !

grep

Plus efficace que le chainage avec find ou cat, il est possible d’utiliser grep seul :

grep <motif> <options> <fichier(s)>

# exemple :
grep "getLastTag" -rn *
Git/Script.pm:94:        $branch = $this->getLastTag;
Git/Script.pm:197:  my $to   = shift || $self->getLastTag;
MEP.pm:1362:    $h_return->{_info}->{version} = $self->git->getLastTag;
MEP.pm:1450:    my $version_generee = $self->git->getLastTag;

# ou dans un seul fichier :
grep "getLastTag" -n "Git/Script.pm"
Git/Script.pm:94:        $branch = $this->getLastTag;
Git/Script.pm:197:  my $to   = shift || $self->getLastTag;

Les options intéressantes sont :

Et sinon grep sait aussi compter ! Plus besoin de chaîner à outrance avec wc :

netstat -an | grep -c 11211

Autre astuce, quand on fait un ps, pour ne plus voir grep apparaitre et éviter de devoir rajouter un | grep -v grep, l’astuce consiste à entourer le premier caractère de crochets.

Exemple :

ps -elf | grep [s]uperscript.sh

Remarque : Plutôt que de faire ceci, la commande pgrep pourrait se révéler plus utile. Voyez ce paragraphe.

ln

Les liens symboliques sont parfois pratiques et la forme la plus courante de la commande est la suivante :

ln -vs <fichier cible> <nom du lien>
# exemple utilisé pour faire croire à un exécutable qu'une bibliothèque se trouvait dans son répertoire :
ln -vs /usr/lib/libudev.so.1.6.2 ./libudev.so.0

L’option -s permet de créer le lien de manière symbolique et non physique.

Un cas d’usage plus intéressant consiste à faire des liens des fichiers de configuration utilisateur, pour les rassembler dans un seul dossier afin de faciliter leur sauvegarde.

Et en moyen mnémotechnique infallible pour retenir l’ordre des arguments, le manuel de FreeBSD1 dit :

An easy rule to remember is that the argument order for ln is the same as for cp(1): The first argument needs to exist, the second one is created.

lvresize

Quand des volumes sont gérés par LVM, on peut facilement les étendre à chaud (en tant que root) :

# Identifier les volumes
df # ou bien : df -h, df -Pm, ...
# Vérifier que l'on dispose d'assez de place pour le groupe :
vgs
# Augmenter la taille du volume
lvresize -r -L +XXG /dev/mapper/le_volume_qui_correspond

L’option -r (--resizefs) est là pour retailler le volume pour prendre en compte la nouvelle taille immédiatement. Sans ça, il faut passer manuellement un coup de resizefs après coup sur le volume modifié.

L’argument -L attend la taille qu’on veut avoir. Préfixer avec + pour rajouter de l’espace, au lieu d’avoir à calculer à la main la taille totale finale. Rajouter un suffixe pour l’unité. Souvent cela sera G.

La véritable forme du -L est (extrait du manuel de lvresize) :

  -L|--size [+|-]Size[m|UNIT]
         Specifies the new size of the LV.  The --size and
         --extents options are alternate methods of specifying
         size.  The total number of physical extents used will be
         greater when redundant data is needed for RAID levels.
         When the plus + or minus - prefix is used, the value is
         not an absolute size, but is relative and added or
         subtracted from the current size.

pgrep

Plutôt que de faire ps -ef | grep process voire même ps -ef | grep [p]rocess et autres chaînages parfelus, utiliser plutôt la commande pgrep.

Voici quelques exemples :

# ps -ef | grep [p]rocess
pgrep -fal process

# ps -ef | grep [p]rocess | awk '{print $1}'
pgrep process

Et ne pas hésiter à aller voir le manuel de cette commande. Mais à noter qu’en fonction du besoin, ps n’est pas à oublier non plus.

ps

Pour trouver les processus bloqués, faire ps -elfy |grep '^D'.

L’état D correspond à un « uninterruptible sleep ». C’est moche, mais parfois ça arrive dans la vie d’un processus. Vous pouvez vous tourner vers cet article (en anglais) qui l’expliquera bien mieux que moi.

read

Fichier complet :

while read ma_var; do
    echo "${ma_var}"
done < "mon_fichier"

En séparant les champs de fichier :

while IFS=: read user pass uid gid full home shell
do
    echo -e "$full :\n\
    Pseudo : $user\n\
    UID :\t $uid\n\
    GID :\t $gid\n\
    Home :\t $home\n\
    Shell :\t $shell\n\n"
done < /etc/passwd

Et si on ne veut pas tous les champs (la variable “x” contiendra le reste de la ligne):

while IFS=: read user pass uid x
do
    echo -e "Pseudo : $user\n\
    UID :\t $uid\n\  \n"
done < /etc/passwd

rsync

Dans le cadre d’une sauvegarde via SSH, la commande prend la forme suivante :

rsync -zvrt --delete -e ssh /un/chemin/important utilisateur_distant@<serveur>:/chemin/distant/de/destination

Les arguments zvrt peuvent être remplacés par auv si les utilisateurs locaux et distants sont les mêmes. Dans l’exemple les fichiers tranférés deviendront la propriété de utilisateur distant.

Remarques

Comme pour la liste de commandes VIM, celle-ci sera mise à jour de temps à autre.