💾 Archived View for bwog-notes.chagratt.site › 2015 › aide-m%C3%A9moire-shell › index.gmi captured on 2024-08-18 at 16:55:31. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2024-07-08)
-=-=-=-=-=-=-
Rédigé le 11 mai 2015 - modifié le 11 juillet 2024. Étiquettes : shell
Commandes shell usuelles (ou un peu moins) avec cas d'usage.
_Attention_ : Je rappelle qu'au quotidien je manipule des systèmes Lignux.
Si je ne l'ai pas marqué explicitement, je n'ai pas testé sur un système UNIX.
Pour des astuces spécifiques à Bash vous pouvez
consulter son aide mémoire dédiée
.
La commande à maintenant
.
Pour sauvegarder un dossier en conservant ses attributs :
cp -avr <origine> <destination>
_Remarque_ : cette commande est utile pour une copie temporaire en vue de faire un éventuel retour arrière.
Pour une sauvegarde régulière et plus poussée il vaut mieux se tourner vers des outils comme rsync.
Pour rechercher un motif dans un ensemble de fichiers,
il est possible d'utiliser grep à l'aide de l'argument exec
find <chemin> -name "<fichiers>" -exec grep "<motif>" {} \; -print
La sortie produite ressemblera à
contenu éventuel du grep sur fichier 1 fichier 1 correspondant à -name fichier 2 correspondant à -name contenu éventuel du grep sur fichier 3 fichier 3 correspondant à -name fichier 4 correspondant à -name contenu éventuel du grep sur fichier N fichier N correspondant à -name etc ...
En plaçant l'argument print avant exec, la logique d'affichage s'inverse :
d'abord afficher le nom des fichiers puis le contenu éventuel.
il faut absolument être sûr des fichiers sur lesquels on veut agir.
Pour cela il faut utiliser -ls en tout premier essai.
find <chemin> -name "<fichiers>" -ls
Il vaut mieux perdre quelques dizaines de minutes à relire une liste de fichiers que de perdre des heures ou des jours à restaurer une sauvegarde !
Plus efficace que le chainage avec find ou cat, il est possible d'utiliser grep seul :
grep <motif> <options> <fichier(s)> # exemple : grep "getLastTag" -rn * Git/Script.pm:94: $branch = $this->getLastTag; Git/Script.pm:197: my $to = shift || $self->getLastTag; MEP.pm:1362: $h_return->{_info}->{version} = $self->git->getLastTag; MEP.pm:1450: my $version_generee = $self->git->getLastTag; # ou dans un seul fichier : grep "getLastTag" -n "Git/Script.pm" Git/Script.pm:94: $branch = $this->getLastTag; Git/Script.pm:197: my $to = shift || $self->getLastTag;
Les options intéressantes sont :
- n : afficher les numéros de ligne
- r : récursif, lors d'une recherche avec joker
- i : au besoin, pour le motif insensible à la casse
Et sinon grep sait aussi compter ! Plus besoin de chaîner à outrance avec wc :
netstat -an | grep -c 11211
Autre astuce, quand on fait un ps, pour ne plus voir grep apparaitre et éviter de devoir rajouter un | grep -v grep,
l'astuce consiste à entourer le premier caractère de crochets.
Exemple :
ps -elf | grep [s]uperscript.sh
_Remarque_ : Plutôt que de faire ceci, la commande pgrep pourrait se révéler plus utile.
Je vous redirige
Les liens symboliques sont parfois pratiques et la forme la plus courante de la commande est la suivante :
ln -vs <fichier cible> <nom du lien> # exemple utilisé pour faire croire à un exécutable qu'une bibliothèque se trouvait dans son répertoire : ln -vs /usr/lib/libudev.so.1.6.2 ./libudev.so.0
L'option -s permet de créer le lien de manière symbolique et non physique.
Un cas d'usage plus intéressant consiste à faire des liens des fichiers de configuration utilisateur,
pour les rassembler dans un seul dossier afin de faciliter leur sauvegarde.
Et en moyen mnémotechnique infallible pour retenir l'ordre des arguments, le manuel de FreeBSD[^1] dit :
An easy rule to remember is that the argument order for ln is the same as for cp(1):
The first argument needs to exist, the second one is created.
Cette commande faisant partie de la suite d'outils liés à LVM, j'ai créé une page spécifique que vous trouverez ici :
Plutôt que de faire ps -ef | grep process voire même ps -ef | grep [p]rocess et autres chaînages parfelus, utiliser plutôt la commande pgrep.
Voici quelques exemples :
# ps -ef | grep [p]rocess pgrep -fal process # ps -ef | grep [p]rocess | awk '{print $1}' pgrep process
Et ne pas hésiter à aller voir le manuel de cette commande.
Mais à noter qu'en fonction du besoin, ps n'est pas à oublier non plus.
Pour trouver les processus bloqués, faire ps -elfy |grep '^D'.
L'état D correspond à un « uninterruptible sleep ».
C'est moche, mais parfois ça arrive dans la vie d'un processus.
Vous pouvez vous tourner
(en anglais) qui l'expliquera bien mieux que moi.
Pour une vue plus complète des processus (en utilisant le style BSD) :
ps auwwxf
Qui affichera tous les processus en vue arborescente,
avec également la commande utilisée.
En prenant une largeur illimitée à l'affichage (le ww).
Fichier complet :
while read ma_var; do echo "${ma_var}" done < "mon_fichier"
En séparant les champs de fichier :
while IFS=: read user pass uid gid full home shell do echo -e "$full :\n\ Pseudo : $user\n\ UID :\t $uid\n\ GID :\t $gid\n\ Home :\t $home\n\ Shell :\t $shell\n\n" done < /etc/passwd
Et si on ne veut pas tous les champs (la variable "x" contiendra le reste de la ligne):
while IFS=: read user pass uid x do echo -e "Pseudo : $user\n\ UID :\t $uid\n\ \n" done < /etc/passwd
Dans le cadre d'une sauvegarde via SSH, la commande prend la forme suivante :
rsync -zvrt --delete -e ssh /un/chemin/important utilisateur_distant@<serveur>:/chemin/distant/de/destination
Les arguments zvrt peuvent être remplacés par auv si les utilisateurs locaux et distants sont les mêmes.
Dans l'exemple les fichiers tranférés deviendront la propriété de utilisateur distant.
Pour insérer le contenu d'un fichier dans d'autres.
Exemple ici, en insérant le texte d'une licence logicielle en en-tête de scripts, ligne 2.
Mettons un fichier license contenant le texte à insérer,
et des scripts .sh (dans le même dossier) :
for f in *.sh; do sed -i -e "1r license" "$f"; done
_Remarque_ la version de sed employée est la version GNU, d'où le -i.
Avec une autre version de sed, il faudra passer par un fichier intermédiaire :
for f in *.sh; do sed -e "1r license" "$f" > "$f.tmp"; mv "$f.tmp" "$f"; done
J'ai aussi
des notes diverses à cet endroit
.
Elles parlent notamment de sed, il y a des choses sur awk, sur les REGEX, les descripteurs de fichiers, ...
Il me faudrait les mettre au propre sur le site un jour, mais elles peuvent néanmoins être utiles.
Comme pour la liste de commandes VIM, celle-ci sera mise à jour de temps à autre.
[^1]:
-------------------------------
← Plus récent : Excecution d'une commande dans notepad++
→ Plus ancien : Apache JMeter : ouverture de la catégorie, premières réflexions et liens
Aléatoire : Arrivée d'un blogroll
Contenu sous licence CC-BY-SA