====== Commandes Linux ======
Certaines commandes (''grep'', ''ls'', ...) acceptent en paramètre ''%%--%%color=always'' qui permet de garder les colorations lorsque les commandes sont pipées. Utile pour piper plusieurs ''grep'', par exemple. ([[https://superuser.com/questions/923275/how-can-i-make-grep-respects-colors-on-a-pipe|Source]])
* [[https://shafi.ddns.net/blog/customize-nano-text-editor|Customize Nano Text Editor]]
==== awk ====
* [[https://learnbyexample.github.io/learn_gnuawk/]]
=== Sommer des entiers ===
[[https://stackoverflow.com/questions/450799/shell-command-to-sum-integers-one-per-line|Source]]
Avec un entier par ligne:
awk '{s+=$1} END {print s}' filesrc
=== Statistiques ===
[[https://unix.stackexchange.com/questions/13731/is-there-a-way-to-get-the-min-max-median-and-average-of-a-list-of-numbers-in|Source]]
# avec une valeur par ligne dans $values :
avg=$(echo "$values" | awk '{x+=$0}END{print x/NR}')
min=$(echo "$values" | awk 'NR==1||$0x{x=$0}END{print x}')
Autre façon de faire une moyenne ([[https://linuxconfig.org/calculate-column-average-using-bash-shell|source]]) :
awk '{ total += $1; count++ } END { print total/count }' file.txt
==== bc ====
=== Faire du calcul flottant ===
[[https://unix.stackexchange.com/questions/66766/are-operations-on-floats-supported-with-bc|Source]]
echo "5/2" | bc -l # 2.50000000000000000000
ou
echo "scale=1;5/2" | bc # 2.5
==== bsdiff et bspatch ====
Ces binaires proviennent du paquet ''bsdiff'' et permettent de comparer des binaires (''bsdiff'') pour générer un patch des différences et d'ensuite appliquer ce patch à un binaire (''bspatch'').
bsdiff oldfile newfile patchfile
bspatch oldfile newfile patchfile
==== crontab ====
Les logs des exécutions des crons sont dans ''/var/log/syslog'':
sudo grep CRON /var/log/syslog
Interagir avec les crons d'un autre utilisateur:
crontab -u $user [action]
Parmi les actions, ''-r'' permet de supprimer le fichier de cron.
Lister les crons de tous les utilisateurs:
for user in $(cut -f1 -d: /etc/passwd);
do
crontab -u $user -l
done;
=== Ne pas envoyer les sorties textuelles par mail ===
[[http://www.auxnet.org/index.php/the-news/228-stop-cron-daemon-from-sending-email-for-each-job]]
Avant les déclarations des CRONs, préciser la variable suivante:
MAILTO=""
==== curl ====
* [[https://jpmens.net/2025/01/23/uploading-a-message-to-an-imap-server-using-curl/|Uploading a message to an IMAP server using curl]]
Obtenir une page web avec les en-têtes:
curl -sD -
Options:
* s'authentifier sur une authentification basique: ''%%--%%user admin:pass'', ou sinon ''"http://admin:pass@ip/"''. Si juste un nom d'utilisateur est précisé, le mot de passe sera demandé par un prompt.
* ''-f'': considère les erreurs HTTP comme de vraies erreurs (= renvoie un code d'erreur)
* ''%%--%%local-port 20'': spécifie le port local de connexion
* ''-I'' n'affiche que les headers de la réponse
* ''-i'' affiche également les en-têtes de la réponse
* ''%%--%%interface '': préciser par quelle interface réseau doit passer la requête
* ''-L'' suivre les redirections HTTP (vers HTTPS, par exemple)
* ''-s'': mode silencieux
* ''%%--%%data "param1=value1¶m2=value2"'' ou ''%%--%%data "param1=value1" %%--%%data "param2=value2"'': préciser le contenu de champs POST. La méthode HTTP sera POST par défaut. [[https://superuser.com/a/149335|Source]]
* ''-X '': précise la méthode HTTP
* ''-F "userid=32"'' : précise un couple clé/valeur d'une requête POST
* ''-F "img=@/tmp/img.png"'' : précise le fichier à envoyer via un formulaire POST
Pour afficher les en-têtes de la requête, il faut utiliser le mode verbeux avec l'option ''-v''.
Pour que ''curl'' ne renvoie rien comme information (la redirection provoque l'affichage de statistiques de progression, le ''-s'' sert à éviter ça):
curl -s https://url/ > /dev/null
Récupérer uniquement le code HTTP de réponse ([[https://stackoverflow.com/questions/6136022/script-to-get-the-http-status-code-of-a-list-of-urls|source]]):
curl -o /dev/null --silent --head --write-out "%{http_code}\n" $url
==== cut ====
[[https://www.thegeekstuff.com/2013/06/cut-command-examples/|Source]]
dpkg -l | grep php5 | cut -c5-20
dpkg -l | grep php5 | cut -d ' ' -f 3
Le séparateur par défaut est la tabulation.
==== diff ====
diff
Options :
* ''-y'' : met les fichiers côte à côte
* ''%%--%%suppress-common-lines'' : n'affiche pas les lignes identiques
Avoir un diff coloré : utiliser le programme ''colordiff''.
Alias sympa :
alias diff='colordiff -y --suppress-common-lines'
==== echo ====
* [[https://stackoverflow.com/questions/525872/echo-tab-characters-in-bash-script]]
Options:
* ''-n'': ne pas faire de retour à la ligne
* ''-e'': interprète les séquences comme ''\t''. Nécessaire pour bash, pas avec zsh.
La commande ''printf'' interprète automatiquement les séquences comme ''\t'' et a moins de variantes suivant les shells.
==== find ====
find -name
Options:
* ''-delete'' : supprimer les fichiers trouvés
* ''-exec du -ch {} +'' : connaître la taille des fichiers trouvés. S'il y a trop de fichiers, ''find'' va faire des paquets de paramètres et plusieurs appels à ''du''. La solution est d'utiliser : ''find -type f -iname *.jpg -print0 | du -ch --files0-from=-'' ([[https://unix.stackexchange.com/questions/41550/find-the-total-size-of-certain-files-within-a-directory-branch|source]]).
* ''-type d'' : cherche uniquement des dossiers
* ''-perm -g+r,g+x'' : cherche les fichiers avec le groupe qui peut lire et exécuter
* ''\! -perm -g+r'' : cherche les fichiers que l e groupe n'a pas le droit de lire
Sources:
* [[https://opensource.com/article/18/4/how-use-find-linux]]
* [[https://www.cyberciti.biz/faq/howto-find-a-directory-linux-command/]]
Lister tous les fichiers d'un dossier, récursivement:
find .
==== grep ====
Options:
* ''-I'': ne pas chercher dans les fichiers binaires
* ''-v'': inverser la recherche: prendre les motifs qui ne correspondent pas.
* ''-L'': affiche les fichiers ne contenant pas le motif
* ''-A '': affiche ''nb'' lignes de contexte après
* ''-B '': affiche ''nb'' lignes de contexte avant
* ''-C '': affiche ''nb'' lignes de contexte avant et après
* ''%%--%%no-group-separator'': retire le séparateur entre les résultats lorsque des lignes de contexte sont ajoutées
* ''-o'': ne renvoyer que les parties de la ligne qui correspondent au motif
* ''%%--%%include \*.scm'': cherche uniquement dans les fichiers terminant par ''.scm'' ([[https://stackoverflow.com/questions/12516937/how-can-i-grep-recursively-but-only-in-files-with-certain-extensions|source]])
* ''%%--%%exclude-dir=some-dir'': exclue tous les fichiers dans le dossier donné
Exclure plusieurs motifs ([[https://www.baeldung.com/linux/grep-exclude-multiple-patterns|source]]) :
grep -v -e foo -e bar
=== Expression régulières ===
Faire un OU: '''pattern1\|pattern2'''
Les lignes commençant par 19 ou 23:
grep '^\(19\|23\)'
egrep '^(19|23)'
Pour utiliser les quantificateurs paresseux (//non-greedy// / //lazy//), il faut utiliser l'option ''-P''. Les quantificateurs paresseux permettent de terminer une regex dès qu'une première occurrence est trouvée, cela se fait un rajoutant un point d'interrogation après le quantificateur ([[https://stackoverflow.com/questions/3027518/how-to-do-a-non-greedy-match-in-grep/3027524|source]]):
grep -P -o "\[\[https?:\/\/.+?\]\]"
==== htop ====
* [[https://peteris.rocks/blog/htop/|htop explained]]
==== ls ====
=== Changer la couleur de la sortie ===
[[https://doc.ubuntu-fr.org/ls_couleur]]
# 1. Esporter la configuration actuelle:
dircolors -p > ~/.ls_colors
# 2. Changer la configuration dans le fichier .ls_colors
# 3. Rajouter dans le bashrc:
eval `dircolors $HOME/.ls_colors` # dircolros va définir la variable LS_COLORS.
==== lsof ====
Liste les fichiers ouverts.
sudo lsof +L1 # liste les fichiers ouverts qui ont moins d'un lien physique (= qui ont été supprimés depuis leur ouverture)
Lister les fichiers ouverts par un processus :
lsof -p $pid
==== mktemp ====
[[https://www.cyberciti.biz/tips/shell-scripting-bash-how-to-create-temporary-random-file-name.html|Source]]
Permet de créer un fichier temporaire avec un nom aléatoire, dans le dossier ''/tmp/''.
==== perf ====
* [[http://www.brendangregg.com/perf.html|Linux perf examples]]
* [[https://gitlab.in2p3.fr/grasland/tp-perf|TP perf]]
==== popd, pushd et dirs ====
* [[https://unix.stackexchange.com/questions/77077/how-do-i-use-pushd-and-popd-commands]]
dirs # visualiser la pile des répertoires
pushd some_dir # va dans le dossier some_dir et l'ajoute à la pile des répertoires
popd # va dans le dossier précédent, en enlevant de le répertoire de la pile
==== readlink ====
Donne le chemin absolu d'un fichier ou d'un dossier.
==== rsync ====
rsync ~/a/b/ /c/b
Tout le contenu de ''/a/b'' ira dans ''/c/b/''.
Ces commandes sont équivalentes (exemple tiré du man):
rsync -av /src/foo /dest
rsync -av /src/foo/ /dest/foo
Options:
* ''-L'' permet de remplacer les liens symboliques par leur véritable contenu. Ne pas oublier de mettre ''-r'' pour que cela s'applique récursivement aux dossiers (inclus dans le raccourci ''-a'')
* ''%%--%%no-perms'' ne préserve pas les permissions
* ''-P'' affiche la progression
* ''-n'' explique ce qui va se passer, sans le faire
* ''%%--%%size-only'' compare les fichiers en se basant uniquement sur leur taille, ne fait pas attention aux timestamps
* ''-c'': compare les fichiers avec leur hash
* ''%%--%%exclude='PATTERN''' exclut les fichiers correspondant au pattern. rsync ne comprend pas les regex, seulement l'astérisque a du sens (sinon, combiner avec ''find''...)
* ''%%--%%omit-dir-times'' : ignore les dates de modifications des répertoires
* ''-i'' ou ''%%--%%itemize-changes'' : permet de savoir pour quelle raison un fichier est transféré (voir le man pour la signification des symboles) ([[https://unix.stackexchange.com/questions/341413/see-only-changes-when-running-rsync/341415|source]])
* [[https://stackoverflow.com/questions/4493525/rsync-what-means-the-f-on-rsync-logs]]
==== sed ====
* [[https://www.folkstalk.com/2013/03/sed-remove-lines-file-unix-examples.html]]
* [[https://opensource.com/article/20/12/sed]]
* [[http://sed.sourceforge.net/sed1line_fr.html]]
* ''-i'': éditer directement les fichiers. Par défaut, ''sed'' affiche le résultat, et rediriger la commande vers le même fichier efface le contenu du fichier...
=== Enchaîner plusieurs commandes ===
Les séparer par des points-virgules :
sed -E 's/foo/bar/;/^\s*$/d'
=== Remplacer du texte dans des fichiers ===
[[https://unix.stackexchange.com/questions/112023/how-can-i-replace-a-string-in-a-files|Source]]
sed -i 's/toreplace/replaced/g' *
# Mac: il est nécessaire de préciser une extension pour les fichiers de sauvegardes:
sed -i.bak 's/toreplace/replaced/g' *
=== Supprimer des caractères dans chaque ligne ===
Pour supprimer tous les guillemets:
sed 's/"//g'
=== Supprimer les lignes qui contiennent un motif ===
sed '/2K/d' fichier
=== Supprimer les lignes vides ===
sed '/^$/d' fichier
ou les lignes qui ne contiennent rien (potentiellement uniquement des espaces) :
sed '/^\s*$/d' fichier
=== Supprimer les redondances de caractères ===
[[https://unix.stackexchange.com/questions/19014/how-to-strip-multiple-spaces-to-one-using-sed|Source]]
Ici, des espaces: s'il y a plus de un espace consécutif, on ne garde que le premier:
sed -n 's/ \+/ /gp'
=== Supprimer tous les espaces au début d'une ligne ===
[[https://stackoverflow.com/questions/34322188/removing-all-spaces-from-the-beginning-of-lines|Source]]
sed 's/^[[:space:]]*//g'
=== Extraire et réordonner les éléments d'une chaîne ===
echo "Releve_n_9999_du_26_10_2012_123456789_abcdfeg.pdf" | sed -e "s/Releve_n_[0-9]*_du_\([0-9]*\)_\([0-9]*\)_\([0-9]*\)_.*/\3-\2-\1.pdf/" # 2012-10-26.pdf
=== Ne garder que les 100 premières lignes ===
sed -i 100q $fichier
=== Préfixer toutes les lignes ===
Ici par une tabulation ([[https://stackoverflow.com/questions/2099471/add-a-prefix-string-to-beginning-of-each-line|source]]) :
sed 's/^/\t/'
=== Supprimer les premières lignes jusqu'à celle contenant un motif ===
Tant que le motif donné n'est pas trouvé dans une ligne, supprimer les lignes et afficher toutes les lignes qui suivent (n'affiche pas la première ligne qui correspond au motif ; [[https://www.unix.com/shell-programming-and-scripting/248021-sed-printing-lines-after-pattern-matching-excluding-line-containing-pattern.html|source]]) :
# Supprime toutes les entrée de logs antérieures au 22 avril 2021 :
sed '1,/22\/Apr\/2021/d' nginx-access.log
=== Afficher les lignes jusqu'à atteindre un motif (inclus) ===
[[https://unix.stackexchange.com/questions/11305/show-all-the-file-up-to-the-match|Source]]
sed '/pattern/q' $fichier
=== Ne garder qu'un ensemble de lignes ===
[[https://stackoverflow.com/questions/83329/how-can-i-extract-a-predetermined-range-of-lines-from-a-text-file-on-unix|Source]]
sed -n '16224,16482p' filename > newfile
=== N'afficher que les lignes où on fait une substitution ===
sed -nE "s/mpiP: Storing mpiP output in \[(.+)\]./\1/p" $f
Le paramètre ''-n'' indique de n'afficher aucune ligne, c'est le flag ''p'' qui indique qu'il faut afficher la ligne.
=== Ne garder que des lignes délimitées ===
Pour ne garder que les lignes qui sont entre des lignes qui contiennent ''BEGIN'' et ''END'' [[https://unix.stackexchange.com/questions/78472/print-lines-between-start-and-end-using-sed|source]] :
sed -n -e '/^BEGIN$/,/^END$/{/^BEGIN$/d;/^END$/d;p;}' input
=== N'affiche que les deuxièmes lignes après un motif ===
* [[https://www.baeldung.com/linux/show-nth-line-after-match|Source]]
Truc
Foo:
Machin
Ligne à afficher
Truc
Foo:
sdfs
Ligne à afficher
sdfs
sed -n '/Foo:/{n;n;p}' $file
==== sort ===
Trie les lignes
Options:
* ''-n'': trie suivant l'ordre numérique et non lexicographique.
=== Trier la sortie de du ===
du -h -d 1 | sort -h
==== sox ====
Permet de convertir les fichiers audio. Installer les paquets ''sox'' et ''libsox-fmt-all'' (pour manipuler du MP3). ''sox'' fournit aussi la commande ''play''.
Convertir un fichier MP3 en WAV:
sox fichier.mp3 fichier.wav
==== tail ====
=== Enlever la première ligne d'un fichier ===
tail -n +2 fichier
==== tar ====
[[https://doc.ubuntu-fr.org/tar|Source]]
Lister les fichiers d'une archive:
tar -tf archive.tar
Créer une archive à partir un dossier:
tar cvf dossier.tar dossier
Créer une archive à partir d'une liste de fichiers (l'arborescence des fichiers passés en arguments est respectée dans l'archive):
tar cvf archive.tar fichier1 fichier2 ...
Extraire une archive:
tar fxv archive.tar[.gz]
Créer un dossier racine dans l'archive, qui contiendra tout ce qui va être archivé ([[https://askubuntu.com/questions/598237/how-to-create-a-common-base-folder-with-tar-and-how-to-rename-folders|source]]):
tar cvf archive.tar --transform 's,^,archive/,' [fichiers à archiver]
==== Top ====
* [[https://codywu2010.wordpress.com/2015/10/22/show-last-used-cpu-in-top-and-ps/]]
La touche ''f'' permet de choisir les champs à afficher. Les champs à afficher doivent être contigus. Une fois de retour à l'interface principale, il est possible de sauvegarder les réglages avec ''Shift+W''. La configuration est sauvegardée dans ''~/.toprc''.
La touche ''H'' permet d'afficher les threads.
==== tr ====
Remplace des caractères dans une chaîne de caractères :
tr ' ' '\n'
Supprimer les espaces :
echo "texte avec des espaces" | tr -d '[:space:]'
''[:space:]'' supprime tous les espaces, y compris les retours à la ligne. Pour ne supprimer que les espaces horizontaux, il faut utiliser ''[:blank:]''.
Remplacer les majuscules par des minuscules ([[https://stackoverflow.com/questions/2264428/how-to-convert-a-string-to-lower-case-in-bash|source]]) :
echo "$a" | tr '[:upper:]' '[:lower:]'
==== uniq ====
[[https://openclassrooms.com/fr/courses/43538-reprenez-le-controle-a-laide-de-linux/40172-extraire-trier-et-filtrer-des-donnees#/id/r-40109|Source]]
Obtenir une liste en enlevant les doublons:
uniq file.txt
Options:
* ''-c'': afficher le nombre d'occurences
* ''-d'': afficher uniquement les lignes présentes plusieurs fois
==== wget ====
[[https://chispa.fr/sima78/index.php?post/2018/11/14/Wget-%E2%80%93-Aspirer-un-site-n%E2%80%99est-pas-un-crime]]
=== Aspirer tous les fichiers d'un site ===
wget -r -k -E -np --limit-rate=100k https://site-aspired.com
Options:
* ''-r'' pour parcourir tous les liens du sites.
* ''-k'' conversion des liens en liens locaux.
* ''-E'' conversion PHP vers HTML, facilite la lecture depuis votre navigateur.
* ''-np'' pour ne pas remonter dans l’arborescence du site
* ''--limit-rate=100k'' limite la vitesse de téléchargement à 100k/s
* ''--no-http-keep-alive --no-cache'' permet de ne pas réutiliser une connexion TCP déjà existante avec un serveur
=== Essayer une connexion HTTP à une page web ===
[[https://stackoverflow.com/questions/6136022/script-to-get-the-http-status-code-of-a-list-of-urls|source]]
wget --server-response --spider --quiet $url
Il faut ensuite parser la réponse du serveur pour vraiment avoir le code HTTP.
==== Autres ====
=== Patch & apply ===
[[https://www.thegeekstuff.com/2014/12/patch-command-examples/|Source]]
diff -u hello.c hello_patched.c > hello.patch
patch < hello.patch
patch -R < hello.patch # pour annuler le patch