====== 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