Opérations en ligne de commande

Table of contents

  1. Opérations en ligne de commande
    1. Opérations pratiques
      1. Comparer les différences entre deux fichiers en colonnes avec diff
      2. Afficher la date sous forme de timestamp UNIX
      3. Afficher un timestamp UNIX dans un format lisible facilement avec date
      4. Afficher un timestamp UNIX dans un format lisible facilement avec Perl
      5. Encoder/décoder une chaîne en Base 64 avec OpenSSL
      6. Extraire le son d'une vidéo avec Mplayer
      7. Transformer le contenu d'un fichier en minuscules/majuscules avec dd
      8. Télécharger tout le contenu d'un répertoire sur un serveur web avec Wget
      9. Effacer le contenu d'un fichier (très) rapidement
      10. Inverser l'ordre d'un fichier
      11. 'ls *' plus rapide
      12. Copier un répertoire en conservant les permissions d'origine avec GNU Tar
      13. Récupérer le contenu texte (ASCII) d'une page web sans les tags HTML avec Curl et sed
      14. Réitérer rapidement une commande avec les droits sudo
      15. Afficher les nouvelles lignes ajoutées à un fichier en temps réel avec less
      16. Supprimer toutes les lignes d'un fichier contenant une certaine chaine de caractères avec sed
      17. Supprimer toutes les lignes d'un fichier contenues entre deux lignes distinctes
      18. Effectuer des conversions de base numérique avec bc
      19. Trouver tous les liens symboliques cassés
      20. Trouver tous les fichiers de plus de N Ko
      21. Afficher des lignes spécifiques d'un fichier ou d'un flux de texte
      22. Utiliser des variables Bash dans une expression Awk
      23. Obtenir un nombre aléatoire dans un intervalle donné
      24. Afficher les pages de man en couleur
      25. Ne lire que les N premiers ou derniers caractères d'un fichier/flux de texte
      26. Compresser + découper + chiffrer une arborescence de fichiers
      27. Générer une séquence comportant une composante numérique incrémentée

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 chaine 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!
Ils faut que ces lignes disparaissent...
</REMOVE>
ligne3
donnera :
ligne1
ligne2
ligne3

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)

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

Utiliser des variables Bash dans une expression Awk

Il est parfois utile de pouvoir accéder à des variables Bash depuis une expression Awk. Pour ce faire, il faut invoquer l'interpréteur Awk avec l'option -v et initialiser une variable Awk à la valeur de la variable Bash. Exemple utilisant un timestamp UNIX récupéré en Bash :
$ grep eth0 /proc/net/dev | cut -d: -f 2 | awk -v ts=`date +%s` '{print ts":"$1,ts":"$9}'
1311629204:4916897284 1311629204:10797655993

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