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
.