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

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

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.

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

Changer de répertoire, revenir au repertoire précedent

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'interieur des doubles parenthèses, les noms des variables n'ont pas besoin d'être prefixé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 subtring 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 

Purger et/ou déplacer des fichiers obsoletes, 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 
 
# Supprimer les vieux fichiers > 80 jours
find . -mtime +80 -type f -exec rm -fv {} \;

Impossible de supprimer tous les fichiers d'un dossier, surement car il y en a trop dans votre répertoire

# rm -f *
-bash: /bin/rm: Liste d'arguments trop longue

Utilisez find :

find . -exec rm -f {} \;

Le nombre d'utilisateurs connectés, leur détail et heure de connection 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