Unix bash, les commandes que l'on ne devrait pas oublier
Par PlaceOweb le jeudi, septembre 14 2006, 18:33 - Bash - Lien permanent
Un bref rappel pour les utilisateurs et les administrateurs sous linux. A coup de vi, awk, sed pour expression régulières, .sh, etc... pour se simplifier les taches quotidiennes d'édition, substitution en faisant des scripts.
awk
Lister un ligne précisée et numérotée d'un fichier
Lister le contenu de la ligne 33 du fichier
awk 'NR == 33 {print $0 }' fichier
Imprimer de la ligne 5 à la ligne 10 , chaque ligne précédée par son numéro
awk 'NR == 5 , NR == 10 {print NR" : " $0 }' fichier
Utiliser une variable dynamique
get=$(($i + 5)) awk -F '&' '{print $'"$get"'}' // Resultat de awk -F '&' '{print $5}'
#!/bin/bash var="variable" variable="dynamique" echo "Ma $var est une ${var} ${!var}" // Resultat : Ma variable est une variable dynamique
find
- Exercices sur find
- Manuel documente la version GNU de find
- Les commandes grep et find
- Wikipedia find et xargs
# ls -al * -bash: /bin/ls: Argument list too long # find . -exec ls -al {} \; # find . -exec grep hinet.net {} \; # find . -type f -print | xargs grep hinet.net
Astuces ou commandes fréquentes
Copier un fichier via SSH
Résumé de l'article Shell Transferer des fichiers via ssh :
ssh serveur "cat fichier_distant" > fichier_local
En le compressant pour économiser du temps de transfert et de la bande passante :
ssh serveur "gzip -c fichier_distant" > fichier_local.gz
ssh serveur "gzip -c fichier_distant" |gunzip > fichier_local
Effacer un fichier ayant un nom débutant par un tiret "-fichier.txt".
rm -- -fichier.txt
Note : -- est utilisable pour toutes les commandes shell.
Renommer plusieurs fichiers simultanément.
Exemple : pour renommer les fichiers *.jpeg en *.jpg
for i in *.jpeg; do mv "$i" "${i%.jpeg}.jpg"; done
Afficher les lignes d'un fichier sans les lignes commentées.
Les lignes commentées sont celles qui commencent par # dans les fichiers. Pour afficher à l'écran le contenu du fichier sans ces lignes, tapez :
sed -e "/^#/d" fichier
Explication de la commande :
- sed (Stream Editor) permet de travailler sur les flux.
- ^ signifie tout ce qui commence par (dans notre cas, ce qui commence par #).
- d permet de supprimer les lignes qui correspondent à l'expression indiquée entre les barres obliques (/^#/ dans notre exemple).
Supprimer les ^M en fin de ligne d'un fichier texte écrit sous Windows.
Il suffit de taper au choix dans vim:
:set fileformat=unix
:%s/\r//g ou :%s/(CTRL+v)(CTRL+m)//g
En dehors du fichier
sed s/{CTRL+v}{CTRL+m}//g filename >> newfile
Supprime tout vos caractères 'r' du fichier
tr -d 'r' < fichier_windows.txt > fichier_windows_converti.txt
Supprimer les lignes vides (ou ne contenant que des espaces) dans un fichier
sed '/^[[:space:]]*$/d' /TMP/fichier
Supprimer les lignes vides sous VI
:g/^$/d
Substitution de "abc" par "ijk" sous VI
:%s/abc/ijk/g
Changer de répertoire, revenir au répertoire précédent
cd $OLDPWD
ou
cd - #permet de remonter autant de fois que l'on veut
Vider le contenud'un fichier existant ou qui n'existe pas
:>fichier
Calculer en bash
Calculs : faire des additions, soustractions, multiplications, divisons, modulos... La liste des opérations est la suivante :
- + , - , *, / : addition, soustraction, multiplication, division
- % : reste de la division entière
- ** : exponentiel
a=2 b=4 c=1 d=$(( a**b + c )) #retourne "2 puissance 4 plus 1" = "17" echo $d
Remarque : à l'intérieur des doubles parenthèses, les noms des variables n'ont pas besoin d'être préfixés par le caractère $. Vous pouvez néanmoins le faire quand même, les deux syntaxes seront acceptés.
# Incrémente une variable, de la même manière que let y=y+1 et y=$(($y+1)) y=`expr $y + 1` y=$(($y+1))
Un substring en bash
# Extrait une sous-chaîne de caractères de $longueur caractères, en partant de $position. z=`expr substr $chaine $position $longueur`
Convertir en majuscule et minuscule en bash
Tiré de Le shell Bash et plus encore
# Convertit le premier caractère en majuscule word=abce123azreaz first=`echo ${word:0:1} | tr 'a-z' 'A-Z'` rest=`echo ${word:1} | tr 'A-Z' 'a-z'` echo "$first-$rest" # Retourne : A-bce123azreaz
Dates
Obtenir une date formatée il y a plusieurs jours (1 mois)
date +%d%m%Y --date='-1month'
Purger et/ou déplacer des fichiers obsolètes, idéal pour l'archivage
cd /monRepertoire/quiContient/lesVieuxFichiers # Compresser en tar.gz les fichiers vieux d'il ya plus d'un jour tar -czvf - `find . -daystart -mtime +0 -type f -print` > `date +"%Y%m%d"`/ftparchives/$maDate.tar.gz # Rechercher les fichiers modifiés aujourd'hui dans de dossier web find /var/www -mtime 0 # Supprimer les vieux fichiers > 80 jours find . -mtime +80 -type f -exec rm -fv {} \; # Rechercher, puis supprimer les dossiers .svn en récursif find . -name .svn -type d -exec ls -al {} \; find . -name .svn -type d -exec rm -frv {} \;
Impossible de supprimer tous les fichiers d'un dossier, sûrement car il y en a trop dans votre répertoire
# rm -f * -bash: /bin/rm: Liste d'arguments trop longue Argument list too long
Utilisez find :
find . -exec rm -f {} \;
Autres ressources liées
Comment effacer un "gros" répertoire (50000 fichiers par exemple) ?
J'ai mon répertoire qui fait 3Go ! J'ai donc voulu le vider, mais impossible. Il y a presque 50 000 fichiers, et quand je fais un rm *, j'ai l'erreur : bash: /bin/rm: Liste de paramètres trop longue
On peut taper en ligne de commande :
find tonRepertoire -type f | xargs rm -f
Supprimer une grande quantité de fichiers impossible
ls | xargs rm -f
Programmation.shell : Supprimer liste de fichier en bash
xargs -a a_supprimer.lst -d \n rm
Le nombre d'utilisateurs connectés, leur détail et heure de connexion sont accessibles depuis les commandes : finger who w
serveurLinux:~# finger Login Name Tty Idle Login Time Office Office Phone root root *pts/0 Jan 25 01:07 (ags84-1-83-242-241-7.fbx.proxad.net) root root *pts/4 17:12 Jan 22 11:27 (lns-zfv-48f-61-157-154-112.adsl.proxad.net) serveurLinux:~# who root pts/0 2008-01-25 01:07 (ags84-1-83-242-241-7.fbx.proxad.net) root pts/4 2008-01-22 11:27 (lns-zfv-48f-61-157-154-112.adsl.proxad.net) serveurLinux:~# w 03:20:50 up 3 days, 14:45, 2 users, load average: 0,12, 0,05, 0,01 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 ags84-1-83-242-2 01:07 0.00s 0.25s 0.00s w root pts/4 lns-zfv-48f-61-1 Tue11 17:14 2:42m 0.75s -bash
Ressouces
Sites Bash utiles et utilisés
- Une exploration en profondeur de l'art de la programmation shell, le guide avancé (4.0-fr) d'écriture des scripts Bash et ses exemples de scripts (18 juin 2006)
- Approfondir Bash
- Toutes les commandes linux
- http://www.shellunix.com/
- Les Principales commandes
- Les expressions régulières
- La commande sed
- La commande awk
Guide avancé d'écriture des scripts Bash
Traduction française, Guide avancé d'écriture des scripts Bash de l'Advanced Bash-Scripting Guide