Outils Linux courants et syntaxe du shell

1 Syntaxe de base du shell

1.1 Affectation de variables sans espaces


correcte :
val1=1
msg="bonjour"
ref=${msg}  # Référence sans accolades si sans ambiguïté

incorrecte :
val1 = 1
msg = "bonjour"

1.2 Conditions if avec espaces dans les crochets


correcte :
if [ ! -d "${repertoire_local}" ]; then
    echo "Répertoire inexistant : ${repertoire_local}"
fi

1.3 Structures conditionnelles et boucles

1.3.1 if, elif, else, fi


if [ -d ${rep_courant} ]; then
    rep_defini=${rep_courant}
    if [ -d ${rep_valide} ]; then
        mv ${rep_valide}/*.txt ${rep_courant}
        echo "rep_valide=${rep_valide}"
        rm -rf ${rep_valide}
    fi
elif [ -d ${rep_valide} ]; then
    rep_defini=${rep_valide}
else
    echo "Aucun répertoire trouvé !"
    exit 1
fi

Vérification d'une sous-chaîne :


if [[ "${tableau[$index]}" =~ "-" ]]; then
    # Traitement
fi

1.3.2 Boucle for


for idx in ${!tab[@]}  # idx est l'indice de l'élément
do
    echo "${tab[$idx]}"  # Affiche chaque élément via son indice
done

Exemple en une ligne :


for i in seq 0 `expr ${#tab1[@]} - 1` ;do tab2[$i]=0 ;done

1.3.3 Boucle while


while true ; do
    echo $compteur
    break
done

1.3.4 Structure case pour les arguments


initialiser() {
    OPTIONS=`getopt -o -I:-u:-p:h -l IP:,utilisateur:,motdepasse:,aide -- "$@"`
    if [ "$?" -ne 0 ]; then
        echo "Erreur d'option, sortie"
        usage
        exit 1
    fi
    eval set -- "${OPTIONS}"

    delai_attente=30
    journal="$HOME/transfert.log"
    while true ; do
        case "$1" in
            -I|--IP)
                ADRESSE_IP="$2" ; shift ;;
            -u|--utilisateur)
                UTILISATEUR="$2" ; shift ;;
            -p|--motdepasse)
                MOTDEPASSE="$2" ; shift ;;
            -h|--aide)
                usage ; exit 0 ;;
            --)
                shift ; break ;;
            *)
                echo "Option invalide ! Sortie"
                exit 1 ;;
        esac
        shift
    done
}

1.3.5 Parcourir les lignes d'un fichier


while read ligne
do
    echo $ligne
done < $NOM_FICHIER

2 Manipulation des variables

2.0 Variables spéciales


$$  PID du shell courant
$!  PID du dernier processus en arrière-plan
$?  Code de retour de la dernière commande
$*  Liste de tous les arguments (chaîne unique)
$@  Liste de tous les arguments (séparés)
$#  Nombre d'arguments passés
$0  Nom du fichier script
$1 à $n Arguments individuels

2.1 Affectation de variables


msg="Salut monde"
copie=$msg  # copie vaut "Salut monde"
sortie=$(echo $msg)  # Capture la sortie standard
alt_sortie=`echo $msg`  # Méthode alternative

Dans les scripts shell, les variables sont globales par défaut.

2.2 Extraction de sous-chaînes


echo ${NOM_SERVICE}        # Exemple : LY-test-1
echo ${NOM_SERVICE#*-}     # test-1
echo ${NOM_SERVICE##*-}    # 1
echo ${NOM_SERVICE%-*}     # LY-test
echo ${NOM_SERVICE:1}      # Y-test-1
echo ${NOM_SERVICE:1:3}    # Y-t
echo ${NOM_SERVICE/LY-/lv} # lvtest-1
echo ${NOM_SERVICE//t/T}   # LY-TesT-1
echo ${NOM_SERVICE: -1}    # 1 (avec espace avant -1)

2.3 Remplacemant dans les variables


texte="abc-12345-abc"
echo ${texte/abc/ABC}      # ABC-12345-abc
echo ${texte/#abc/ABC}     # ABC-12345-abc (début)
echo ${texte/%abc/ABC}     # abc-12345-ABC (fin)

2.4 Comparaison de chaînes


if [[ "123abc456" =~ "abc" ]]; then
    echo "Succès"
fi

2.5 Tableaux

2.5.1 Longueur


longueur=${#tableau[@]}

2.5.2 Copie


copie_tab=(${tableau[@]})

2.5.3 Affichage


echo ${copie_tab[@]}  # Tous les éléments
echo ${copie_tab}     # Premier élément seulement

2.5.4 Ajout d'éléments


tableau[${#tableau[@]}]=valeur

2.5.5 Tranche de tableau


tableau=(1 2 3 4 5 6 7)
echo ${tableau[@]}       # Tout le tableau
echo ${tableau[@]:0:2}   # Éléments 0 à 1

2.6 Calculs arithmétiques


resultat=$((nombre + 2))

2.7 Exécution de commandes via variables


commande="bash /home/utilisateur/script.sh 50 7"
$commande  # Exécution directe

3 Exemples avec sed

3.1 Extraire entre deux motifs


cat donnees.txt | sed -n '/Début/,/Fin/p'

3.2 Nettoyage et extraction

Extraire le nombre le plus à droite, par exemple :


echo "Num: 5 Index: 2 Port: 10 Routes: 8" | sed 's/.*Routes:[[:space:]]*\([0-9]\+\)/\1/g'

3.3 Insertion autour d'une ligne


sed -i "/ligne_cible/a\après cible" fichier.txt
sed -i "/ligne_cible/i\avant cible" fichier.txt

3.4 Supprimer une plage de lignes


sed -i '10,15d' configuration.ini

3.5 Suprimer après un motif


sed -i '/\[section\]/,$d' config.ini

3.6 Afficher après un motif


sed -n '/\[section\]/,$p' config.ini

4 Utilisation de awk

Exemple 1 : Obtenir un PID spécifique


ps -elf | grep processus | grep -v grep | awk '{print $4}'

Exemple 2 : Comparaison numérique


awk -v val_util=${Utilisation%?} -v seuil=50 'BEGIN{print(val_util>seuil)?1:0}'

Exemple 3 : Compter les champs


echo "champ1,champ2,champ3" | awk -F ',' '{print NF}'

5 Astuces pour les outils shell

5.1 top en mode non enteractif


top -n 1 -b | grep '%Cpu(s)' | sed 's/.* \([0-9]\+.[0-9]\+\) id.*/\1/g'

5.2 Gestion des paquets rpm


rpm -Uvh *.rpm --nodeps --force  # Installation forcée
rpm -ivh paquet  # Installer un paquet
rpm -qa | grep paquet  # Lister les paquets installés
rpm -e --nodeps paquet  # Désinstaller

5.3 Utilisation de yum


yum install --downloadonly --downloaddir=./depot paquet  # Téléchargement sans installation
yum deplist paquet  # Voir les dépendances
yum -y install yum-utils  # Installer les utilitaires
repotrack outil  # Télécharger toutes les dépendances

5.4 Services système


chkconfig --list  # Lister les services
ls /etc/init.d    # Alternative

5.5 Montage de systèmes de fichiers


umount /point/montage

5.6 Informations sur les mots de passe


chage -l utilisateur

5.7 Formatage de dates


date '+%Y-%m-%d %H:%M:%S'

5.8 Lecture d'entrées


IFS_OLD=${IFS}; IFS=,;
read var1 var2 <<< $(echo "$*"); IFS=${IFS_OLD}

5.9 Création rapide de fichiers


seq 1 10 | xargs -i touch fichier.{}

6 Techniques avancées

6.1 Trouver une interface réseau par IP


ip -br address | grep 192.168.1.100 | awk '{print $1}' | cut -d@ -f1

6.2 Transfert de fichiers via lftp


lftp -u ${USER},${MOTDEPASSE} sftp://${ADRESSE}:${PORT} << EOF
mkdir -p ${CHEMIN_DISTANT}
cd '${CHEMIN_DISTANT}'
put ${FICHIER_SOURCE}
bye
EOF

6.3 Processus watchdog


timeout() {
    commande=$*
    $commande >> $journal &
    pid_commande=$!

    temps_actuel=$(date +%s)
    temps_restant=$[ ${delai_attente}-($temps_actuel-$debut) ]
    if [ ${temps_restant} -lt 0 ]; then
        temps_restant=0
    fi
    ( sleep ${temps_restant} ; kill -9 $pid_commande > /dev/null 2>&1) &
    pid_watchdog=$!

    wait $pid_commande > /dev/null 2>&1
    retour=$?
    if [ $retour -ne 0 ]; then
        exit 1
    fi
}

6.4 Exécution distante via SSH


identifiant=$(ssh utilisateur@host "sudo su -c 'docker ps | grep conteneur'" | head -n 1 | awk '{print $1}')

6.5 Vérifier l'heure de création sur XFS


ls -i ${chemin_fichier}
df -T ${chemin_fichier}
xfs_db -r -c "inode 123456" -c "p v3.crtime.sec" /dev/sda1

6.6 Surveiller les E/S disque


iostat -x 1 10
iotop -oP
pidstat -d 1

7 Modification des bibliothèques avec patchelf


patchelf --force-rpath --set-rpath "$chemin_lib" "$fichier_so"
patchelf --set-interpreter "$chemin_lib" "$fichier_so"
patchelf --print-rpath "$fichier_so"

Étiquettes: linux-shell bash-scripting sed-command awk-command variable-manipulation

Publié le 25 juin à 04h17