Tag Archives: unix

Calculer des dates en BASH et PERL

Dans le sens le plus traditionnel, qui est celui des scripts shell (BASH, PERL…) , un script sert principalement à lancer et coordonner l’exécution de programmes.

Donc voilà, j’ai du faire des petites recherches ce matin, afin de manipuler des dates en BASH pour l’un de mes scripts.
J’ai besoin de lancer des traitements, avec en paramètre des dates. Parfois, j’aurais besoin de récupérer la date du jour (facile), parfois d’autres dates, comme la veille, le dernier jour du mois précédent, etc… . Bien évidemment, parfois c’est facile, et parfois, cela l’est beaucoup moins.
Comme je ne travaille pas que sur des infrastructures Linux, mais surtout AIX, la commande date est limitée (ça n’est pas le date GNU).

Je pose ici mon petit pense-bête (un peu comme avec le history), un petit florilège, en BASH et en PERL qui me dépanne bien.

Avant tout, on charge quelques variables….

La date de la veille en PERL

La date du jour + 17 jours en PERL

Le dernier jour du mois en cours en BASH

Le dernier jour du mois suivant en BASH

Le dernier jour du mois précédent en BASH

Allez, amusez-vous bien !!!

La commande ps dans la pratique

Vous aimez beaucoup votre Raspberry, mais voilà, il y a un process gourmand qui consomme toute la CPU.
Pour faire la chasse, ou tout simplement pour savoir ce qui se passe sur votre machine, il y a une commande pratique : la commande ps.
Cette commande est exécutée très souvent, mais très peu de personne l’utilise pleinement. Je vous propose donc, comme avec la commande awk, de partager avec vous mes petits tips.

Trouver les process consommant le plus de mémoire

Trouver les process consommant le plus de cpu

Le détail de ces 2 commandes

J’utilise donc la commande ps avec un certain nombre de paramètres que je vais détailler ci dessous.
ps Liste des processus courants

-e Selectionner l’ensemble des process

  o Spécifier un format utilisateur dont la configuration est :
pmem,pcpu,pid,args le format sera donc définit par mémoire,cpu, numéro de pid et commande

A cela, je rajoute un peu de tri avec les commandes tail et sort :

tail -n +2  : sortie standard à partir de la seconde ligne (pour éviter la sortie des entêtes de colonnes comme %MEM, etc …),
sort -rnk 1 : classé par ordre numérique (n), décroissant (r), et cela, suivant la première colonne (mémoire),
sort -rnk 2 : puis, classé par ordre numérique (n), décroissant (r), et suivant la seconde colonne (cpu),
head : sortie des 10 premières lignes uniquement.

Voilà, j’espère que ces quelques explications vous serviront. Bien entendu, essayer de les adapter au mieux à vos besoins.

GREP – Globally search for Regular Expression and Print it

Qui, travaillant sous Unix ou Linux, n’a jamais utilisé la commande grep? La réponse est simple il me semble: personne!!!
Pour faire simple, grep est une petite famille de 3 commandes qui permet de rechercher une chaine dans des fichiers, et d’en imprimer les lignes.
Elle n’a l’air de rien comme cela, mais c’est une commande terriblement efficace, l’une des commandes les plus utiles dans tout système Unix, avec sed et awk.

Présentation

g/RE/p signifie globally search for RE and print it où RE est un raccourci pour RegularExpression.
Pour faire ultra simple, grep est un outil qui permet de chercher une expression régulière (motif ou pattern en anglais) dans un contenu, et d’en afficher le résultat.

Expression régulière ?

Les expressions régulières, ou plus communément appelées RegEx, constituent un système puissant et rapide afin de rechercher dans des chaînes de caractères un motif (une occurrence, une autre chaine de caractères définie). On utilise les expressions régulières dans presque toutes les commandes d’administration. On peut les retrouver dans de nombreux langages comme le BASH, le PHP, Javascript, etc… ou encore dans des logiciels d’édition, comme vi, Notepad++, PsPad, etc… .
C’est pour quoi, je ne développerai pas plus sur les RegEx ici, car des livres complets existent sur ce sujet, et un article entier serait une bonne façon des aborder, plutôt que quelques lignes posées dans un paragraphe.

Fonctionnement

Ces trois commandes grep fonctionnent de la même façon.
Grep commence à lire la première ligne du fichier (ou depuis l’entrée standard si aucun fichier n’est fourni, ou si le nom – est mentionné) , la copie dans un tampon, la compare à la chaîne de recherche (le motif), et si la comparaison est valide, imprime la ligne à l’écran. Grep va ainsi répéter ce processus jusqu’à la fin du fichier (ou de l’entrée standard).

Les symboles

On va d’abord vite faire le tour des symboles que nous pouvons utiliser dans les expressions régulières.
Les caractères ^ et $ indiquent le début ou la fin d’une chaîne, et permettent donc de la délimiter.
« ^debut »: chaîne qui commence par « debut »
« fin$ »: chaîne qui se termine par « fin »

Les caractères *, + et ?, respectivement zero ou plusieurs, un ou plusieurs, un ou aucun, permettent de donner une notion de nombre.
« abc+ »: chaîne qui contient « ab » suivie de un ou plusieurs « c » (« abc », « abcc » …)
« abc* »: chaîne qui contient « ab » suivie de zero ou plusieurs « c » (« ab », « abc » …)
« abc? »: chaîne qui contient « ab » suivie de zero ou un « c » (« ab » ou « abc »)

Les accolades {,} permettent de donner des limites de nombre.
« abc{2} »: chaîne qui contient « ab » suivie de deux « c » (« abcc »)
« abc{2,} »: chaîne qui contient « ab » suivie de deux « c » ou plus (« abcc » etc..)
« abc{2,4} »: chaîne qui contient « ab » suivie 2, 3 ou 4 « c » (« abcc » .. « abcccc »)

Les parenthèses ( ) permettent de représenter une séquence de caractères.
« a(bc)* »: chaîne qui contient « a » suivie de zero « bc » ou plus

Le pipe (la barre verticale) | se comporte en tant qu’opérateur OU
« un|le »: chaîne qui contient « un » ou « le »
« (un|le) chat »: chaîne qui contient « un chat » ou « le chat »
« (a|b)* »: chaîne qui contient une suite de « a » ou de « b »

Le point . indique n‘importe quel caractère
« ^.{3}$ »: chaîne qui contient 3 caractères

Les crochets [-] définissent une liste de caractères autorisés (ou interdits).
Le signe permet quand à lui de définir un intervalle. Le caractère ^ après le premier crochet indique quand à lui une interdiction.
« [abc] »: chaîne qui contient un « a », un « b », ou un « c »
« [a-z] »: chaîne qui contient un caractère compris entre « a » et « z »
« ^[a-zA-Z] »: chaîne qui commence par une lettre
« ^[^a-zA-Z] »: chaîne qui ne commence pas par une lettre

Des exemples

Oui, parce que c’est bien beau tout cela, mais il faut aussi pratiquer. Vous imaginez qu’on ne va pas non plus faire le tour de la question, mais uniquement faire tomber les premières barrières qui pourraient vous empêcher d’utiliser grep.

Pour des exemples simples, je ne vais pas faire de copier/coller, vous en trouverez ici, et ci-dessous, certains exemple que j’utilise au bureau.

Test les Erreurs dans un fichier de log : il ne faut avoir ni des ORA- ni des PLS- :

Vérifier si une chaine de caractères est présente dans un fichier :

Fonction privée pour valider une adresse email :

Fonction de test si une chaîne de caractères est numérique :

La Famille

Je disais une petite famille, car grep est disponible en trois commandes distinctes mais toutes liées : grep, egrep et fgrep.
Egrep est identique à grep -E.
Fgrep est identique à grep -F.
Rgrep est identique à grep -r.

-E, –extended-regexp
Interpréter le MOTIF comme une expression rationnelle étendue
-F, –fixed-strings
Interpréter le MOTIF comme une liste de chaînes de caractères, séparées par des sauts de ligne. Chacune d’entre elles doit être recherchée.
-r, –recursive
Lire tous les fichiers à l’intérieur de chaque répertoire, récursivement.

 Maintenant, amusez-vous bien, mais je serais curieux de voir cela. Alors n’hésitez pas à publier vos trouvailles.

Crontab pour les nuls

Cron est ce qu’on appelle un planificateur de tâches périodiques pour les systèmes de type Unix. Il permet aux utilisateurs de planifier des tâches pour une exécution périodique. Il est couramment utilisé pour automatiser les tâches de maintenance du système ou d’administration. Je vais faire un rapide tour pour que vous puissiez au moins avancer un peu.
Prenons comme exemple un petit script de sauvegarde qu’on appellera sync_home.sh Ensuite, il y a 2 solutions. Soit l’exécution est rattachée à un utilisateur, soit elle est rattachée au système. Dans le premier cas de figure, il faut se connecter avec cet utilisateur, et exécuter la commande crontab -e . Si ça n’est pas déjà fait, vous allez pouvoir choisir l’éditeur de votre choix.

Dans le second cas, il faudra éditer le fichier /etc/crontab
Les règles se construisent comme indiqué :
# m h dom mon dow command

m est pour minutes [0-59]
h est pour heure [0-23]
dom est pour journée du mois [1-31]
mon est pour mois, de janvier à décembre [1-12]
dow est pour journée du dimanche au samedi [0-6]
command est le chemin d’accès absolu de votre script

Voici des exemples de règles cron :

Exécuter un script à tous les jours à minuit

Exécuter un script le lundi à 14h30

Exécuter un script à toutes les heures

Exécuter un script à toutes les 30 minutes

Enregistrer le fichier, et c’est fini. Ok, pour nous qui avons grandit avec ça, c’est évident, mais il faut aussi penser à ceux qui débutent. Have fun!

AWK par l’exemple

Dans cet article, je vous propose de découvrir l’utilisation de awk (en ligne de commande, et non en script) pour lire ou analyser des fichiers, texte ou CSV, contenant plusieurs délimiteurs ou séparateurs.
Prenons comme exemple ce fichier texte (Prénom, département, mois, jour de naissance, nombre de frères, nombre de sœurs) :

  1. Pour imprimer la 3ème colonne contenant la date de naissance :

En précisant -F’:’ nous précisons à awk que le délimiteur est le caractère ‘:‘ . La troisième colonne correspond donc à $3


2. Pour imprimer le mois de naissance, la 3ème colonne tout séparateur confondu :

En précisant -F'[:;]’ nous précisons à awk que les délimiteurs sont les caractère ‘:‘ et ‘;‘ .


3.  Ajouter des variables, savoir combien de frères et sœurs ont les personnes :

On demande à awk de faire l’addition entre frères et sœurs, et on affiche le résultat.


4. Grouper / Dégrouper des variables en affichant plusieurs lignes pour la même personne :

Nous avons donc pour chaque personne une ligne avec le mois, le jour et l’année de naissance.


5. Utiliser les variables spéciales :

Les variables prédéfinies :
ARGC Nombre d’arguments de la ligne de commande
ARGV tableau des arguments de la ligne de commande-
FILENAME nom du fichier sur lequel on applique les commandes
FNR Nombre d’enregistrements du fichier
FS separateur de champs en entrée
NF nombre de champs de l’enregistrement courant
NR nombre d’enregistrements deja lu
OFMT format de sortie des nombres
OFS separateur de champs pour la sortie
ORS separateur d’enregistrement pour la sortie
RLENGTH longueur de la chaine trouvée
RS separateur d’enregistrement en entrée
RSTART debut de la chaine trouvée
SUBSEP separateur de subscript

Amusez-vous bien!!