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

# 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

Guide avancé d'écriture des scripts Bash

Traduction française, Guide avancé d'écriture des scripts Bash de l'Advanced Bash-Scripting Guide