Opérations en ligne de commande

Opérations pratiques

Comparer les différences entre deux fichiers en colonnes avec diff

diff -ybB --width=80 ficher1 fichier2

Afficher la date sous forme de timestamp UNIX

Le “timestamp” UNIX est le nombre de secondes écoulées depuis le 1/1/1970 00h00 (date surnommée “Epoch”) :

date +%s

Afficher un timestamp UNIX dans un format lisible facilement avec date

date -d @1209041432

Afficher un timestamp UNIX dans un format lisible facilement avec Perl

perl -e 'print(scalar(localtime(1209041432)));'

Encoder/décoder une chaîne en Base 64 avec OpenSSL

echo maChaine | openssl base64              # encode
echo maChaineEnBase64 | openssl base64 -d   # décode

Extraire le son d’une vidéo avec Mplayer

mplayer ma_video.avi -vc dummy -vo null -ao pcm:file=son_video.wav

Transformer le contenu d’un fichier en minuscules/majuscules avec dd

dd if=fichier_original of=fichier_modifié conv=ucase   # transforme le contenu en majuscules

dd if=fichier_original of=fichier_modifié conv=lcase   # transforme le contenu en minuscules

Télécharger tout le contenu d’un répertoire sur un serveur web avec Wget

wget -r -nc -nd -nH --cut-dirs=2 http://www.unsite.com/unrepertoire/lerepertoirequejeveux/

Effacer le contenu d’un fichier (très) rapidement

> lefichier.txt

Inverser l’ordre d’un fichier

cat lefichier.txt | sed '1!G;h;$!d'

‘ls *’ plus rapide

echo *

Copier un répertoire en conservant les permissions d’origine avec GNU Tar

cd /un/repertoire; tar cf - . | tar xf - -C /autre/repertoire

Récupérer le contenu texte (ASCII) d’une page web sans les tags HTML avec Curl et sed

curl http://unsiteweb.com/page.html | sed 's/<[^>]*>//g'

Réitérer rapidement une commande avec les droits sudo

sudo !!

Afficher les nouvelles lignes ajoutées à un fichier en temps réel avec less

less +F /un/fichier

Il est également possible de passer temporairement en mode “temps réel” depuis une session en cours de less avec la combinaison de touches Shift+f.

Supprimer toutes les lignes d’un fichier contenant une certaine chaîne de caractères avec sed

sed -i '/chaine/d' lefichier.txt

Supprimer toutes les lignes d’un fichier contenues entre deux lignes distinctes

sed -i -e '/<REMOVE>/,/<\/REMOVE>/d lefichier.txt

Le fichier :

ligne1
ligne2
<REMOVE>
Bouh, c'est mal!
Il faut que ces lignes disparaissent…
</REMOVE>
ligne3

donnera :

ligne1
ligne2
ligne3

Récupérer les lignes d’un fichier contenues entre deux lignes distinctes

sed -ne '/<PREMIERE-LIGNE>/,/<DERNIERE-LIGNE>/p' lefichier.txt

Le fichier :

ligne1
ligne2
<PREMIERE-LIGNE>
Des lignes qu'elles sont trop bien…
<DERNIERE-LIGNE>
ligne3

donnera :

<PREMIERE-LIGNE>
Des lignes qu'elles sont trop bien…
<DERNIERE-LIGNE>

Effectuer des conversions de base numérique avec bc

Outre les opérations arithmétiques, bc est capable d’effectuer des conversions de bases numériques à l’aise des opérateurs ibase (“input base”, base d’entrée) et obase (“output base”, base de sortie) : il est même possible d’effectuer des opérations arithmétiques dans une certaine base et d’afficher le résultat dans une autre base.

Par défaut bc considère que “ibase” et “obase” sont en base 10 (décimale), il n’est donc pas nécessaire de les définir explicitement lors de vos conversions si vous utilisez l’ibase ou l’obase en base 10 :

$ echo 'obase=2; 145' | bc
10010001

$ echo 'ibase=2; 10010001' | bc
145

⚠️ Attention, si vous changez les bases d’entrée et de sortie, il faut impérativement spécifier “obase” en premier.

$ echo 'obase=16; ibase=2; 11010' | bc
1A

$ echo 'ibase=2; 101111+10000101' | bc
180

Trouver tous les liens symboliques cassés

find -type l | (while read FN ; do test -e "$FN" || ls -ld "$FN"; done)

Il est également possible d’arriver à la même fin d’un seul coup avec une version récente de find (version GNU) :

find -xtype l

Trouver tous les fichiers de plus de N Ko

Pour lister tous les fichiers de plus d'1 Go (1 000 000 Ko) à partir du répertoire courant :

find ./ -size +1000000k -printf "%kKo\t%p\n"

Afficher des lignes spécifiques d’un fichier ou d’un flux de texte

Afficher seulement la 42ème ligne du fichier fichier.txt, avec sed :

sed -n "42p" fichier.txt

Avec AWK :

awk -v l=42 'NR==l{ print }' fichier.txt

Pour afficher seulement de la ligne 10 à la ligne 15 :

awk 'NR>=10 && NR<=15' fichier.txt

Obtenir un nombre aléatoire dans un intervalle donné

La commande shuf (des GNU Coreutils) permet d’obtenir des nombres aléatoires compris dans un intervalle borné. Par exemple si je veux que le nombre aléatoire soit compris entre 10 et 50 :

shuf -n 1 -i 10-50 
40

L’option -n indique la quantité de nombres à produire et afficher (par défaut 40), et -i indique les bornes minimum et maximum.

Afficher les pages de man en couleur

Pour peu que vous utilisiez less comme pager, voici quelques variables d’environnement qui mettront de la couleur dans vos pages de man :

export LESS_TERMCAP_mb=$'\E[01;31m'
export LESS_TERMCAP_md=$'\E[01;31m'
export LESS_TERMCAP_me=$'\E[0m'
export LESS_TERMCAP_se=$'\E[0m'
export LESS_TERMCAP_so=$'\E[01;44;33m'
export LESS_TERMCAP_ue=$'\E[0m'
export LESS_TERMCAP_us=$'\E[01;32m'

Ne lire que les N premiers ou derniers caractères d’un fichier/flux de texte

head -c 42 README.txt   # lit les 42 premiers caractères du fichier README.txt

cat /usr/share/doc/sudo/LICENSE | tail -c 99   # lit les 99 derniers caractères du fichier /usr/share/doc/sudo/LICENSE

Compresser + découper + chiffrer une arborescence de fichiers

Si vous avez besoin de sauvegarder de manière sécurisée une arborescence de fichiers assez volumineuse, voici un one-liner qui fera tout le travail pour vous.

L’exemple suivant compresse et découpe en fichiers de 100M qui sont eux-même par la suite chiffrés via GnuPG — chiffrement symétrique avec la passphrase ‘blah’.

tar cvz -C /chemin/vers -f - dossier | split -d -b 100M --filter 'gpg --symmetric --passphrase blah --batch --cipher-algo aes256 -o $FILE.gpg' - backup.tgz.

Si tout s’est bien passé, il résultera de cette commande N fichiers (backup.tgz.001.gpg, backup.tgz.002.gpg, backup.tgz.00N.gpg) chiffrés. Pour faire l’opération inverse :

gpg --decrypt-files --batch --passphrase blah backup.tgz.0*gpg && rm -f *gpg && cat backup.tgz* | tar xzf -

Générer une séquence comportant une composante numérique incrémentée

seq -fhost%02g.example.net 1 3

Cette commande générera les lignes suivante :

host01.example.net
host02.example.net
host03.example.net

Servir ponctuellement le contenu du répertoire courant en HTTP

Si vous avez besoin de mettre à disposition ponctuellement le contenu d’un répertoire, il existe un module Python très pratique qui permet de servir le contenu du répertoire courant en HTTP sans installer de serveur HTTP complet type Apache/Nginx. Ce module, livré avec la librairie standard de Python, est très simple d’emploi car il ne nécessite pas d’écrire une seule ligne de code Python : placez-vous dans le répertoire donc vous voulez mettre à disposition le contenu, et exécutez la commande suivante :

server:~# cd /boot/
server:/boot# python -m SimpleHTTPServer 80
Serving HTTP on 0.0.0.0 port 80 ...

Puis depuis une autre machine, envoyez une requête HTTP vers le serveur depuis lequel vous avez lancé la commande précédente :

marc@vesper:~% curl http://server
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
<title>Directory listing for /</title>
<body>
<h2>Directory listing for /</h2>
<hr>
<ul>
<li><a href="abi-2.6.32-41-server">abi-2.6.32-41-server</a>
<li><a href="config-2.6.32-41-server">config-2.6.32-41-server</a>
<li><a href="grub/">grub/</a>
<li><a href="initrd.img-2.6.32-41-server">initrd.img-2.6.32-41-server</a>
<li><a href="lost%2Bfound/">lost+found/</a>
<li><a href="memtest86%2B.bin">memtest86+.bin</a>
<li><a href="System.map-2.6.32-41-server">System.map-2.6.32-41-server</a>
<li><a href="vmcoreinfo-2.6.32-41-server">vmcoreinfo-2.6.32-41-server</a>
<li><a href="vmlinuz-2.6.32-41-server">vmlinuz-2.6.32-41-server</a>
</ul>
<hr>
</body>
</html>

Additionner toutes les valeurs numériques de plusieurs lignes

Voir dans la section GNU AWK.

Obtenir la date courante au format RFC3339

date +%FT%T%:z

À noter que les version récentes de date implémentent une option --rfc-3339.

Afficher le débit d’un flux de texte avec pv

Si vous cherchez à connaître le débit d’un flux de texte, vous pouvez utiliser la commande pv de la manière suivante :

while true; do for i in $(seq 1 $(($RANDOM % 100))); do echo $i ; done ; sleep 1; done | pv --line-mode --rate --timer > /dev/null
00:32 [86.7/s] # affichage mis à jour en temps réel

Note : vous pouvez utiliser l’option --average-rate au lieu de --rate afin d’obtenir le débit moyen depuis le lancement de la commande pv.