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. (Source)
awk
Sommer des entiers
Statistiques
# avec une valeur par ligne dans $values : avg=$(echo "$values" | awk '{x+=$0}END{print x/NR}') min=$(echo "$values" | awk 'NR==1||$0<x{x=$0}END{print x}') max=$(echo "$values" | awk 'NR==1||$0>x{x=$0}END{print x}')
Autre façon de faire une moyenne (source) :
awk '{ total += $1; count++ } END { print total/count }' file.txt
bc
Faire du calcul flottant
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
Obtenir une page web avec les en-têtes:
curl -sD - <ip, adresse...>
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-In'affiche que les headers de la réponse-iaffiche également les en-têtes de la réponse--interface <iface>: préciser par quelle interface réseau doit passer la requête-Lsuivre 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. Source-X <method>: 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 (source):
curl -o /dev/null --silent --head --write-out "%{http_code}\n" $url
cut
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 <fichier1> <fichier2>
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
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 <location> -name <expression>
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,findva 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=-(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:
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 <nb>: affichenblignes de contexte après-B <nb>: affichenblignes de contexte avant-C <nb>: affichenblignes 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--exclude-dir=some-dir: exclue tous les fichiers dans le dossier donné
Exclure plusieurs motifs (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 (source):
grep -P -o "\[\[https?:\/\/.+?\]\]"
htop
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
Permet de créer un fichier temporaire avec un nom aléatoire, dans le dossier /tmp/.
perf
popd, pushd et dirs
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:
-Lpermet de remplacer les liens symboliques par leur véritable contenu. Ne pas oublier de mettre-rpour que cela s'applique récursivement aux dossiers (inclus dans le raccourci-a)--no-permsne préserve pas les permissions-Paffiche la progression-nexplique ce qui va se passer, sans le faire--size-onlycompare 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 avecfind…)--omit-dir-times: ignore les dates de modifications des répertoires-iou--itemize-changes: permet de savoir pour quelle raison un fichier est transféré (voir le man pour la signification des symboles) (source)
sed
-i: éditer directement les fichiers. Par défaut,sedaffiche 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
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
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
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 (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 ; 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)
sed '/pattern/q' $fichier
Ne garder qu'un ensemble de lignes
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 source :
sed -n -e '/^BEGIN$/,/^END$/{/^BEGIN$/d;/^END$/d;p;}' input
N'affiche que les deuxièmes lignes après un motif
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
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é (source):
tar cvf archive.tar --transform 's,^,archive/,' [fichiers à archiver]
Top
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 (source) :
echo "$a" | tr '[:upper:]' '[:lower:]'
uniq
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
Aspirer tous les fichiers d'un site
wget -r -k -E -np --limit-rate=100k https://site-aspired.com
Options:
-rpour parcourir tous les liens du sites.-kconversion des liens en liens locaux.-Econversion PHP vers HTML, facilite la lecture depuis votre navigateur.-nppour ne pas remonter dans l’arborescence du site–limit-rate=100klimite la vitesse de téléchargement à 100k/s–no-http-keep-alive –no-cachepermet de ne pas réutiliser une connexion TCP déjà existante avec un serveur
Essayer une connexion HTTP à une page web
wget --server-response --spider --quiet $url
Il faut ensuite parser la réponse du serveur pour vraiment avoir le code HTTP.
Autres
Patch & apply
diff -u hello.c hello_patched.c > hello.patch patch < hello.patch patch -R < hello.patch # pour annuler le patch