Manipulation de string
echo
|
echo -n "sans retour à la ligne"
echo -e "interprétation du caractère d'échappement \r \n"
echo
for i in {1..100..1}
do
echo -ne "$i\r"
sleep .2
if (( $i % 10 == 0 )) ; then
echo
fi
done
|
printf
|
echo $(printf "%02d" $var)
|
|
rg [occurence] [path]
rg --pre ripgrep-preprocess-pdf.sh --pre-glob '*.pdf' [occurence]
|
ripgrep-preprocess-pdf.sh
|
#!/bin/bash
set -e
set -o pipefail
set -u
if [ -s "$1" ]; then
exec pdftotext - -
else
exec cat
fi
|
grep
|
... | grep ^
... | grep -v ^
... | grep jpg$
grep -rin occurence /chemin
... | grep -E 'http://[a-zA-Z0-9._/]+\.jpg'
... | grep -Eo 'http://[a-zA-Z0-9._/]+\.jpg'
grep -Po '(?<=Version )[[:digit:]]+.[[:digit:]]+'
if ! mount | grep -q /media/xxx; then
sshfs user@xxx:/home/user /media/xxx
fi
|
 |
egrep → grep -E Interpret PATTERNS as extended regular expressions
fgrep → grep -F Interpret PATTERNS as fixed strings, not regular expressions |
cut
Découpe une chaîne de caractères
|
echo "123,456,789" | cut -d , -f2
cut -d ' '
|
awk
Fonction de filtre.
|
ls -l | awk '{ print $9 }'
ls -l | awk '{ for (i=6; i<NF; i++) printf "%s ", $i ; print $NF }'
awk -v vawk="$1" '$0 ~ vawk ... '
find . -type f -exec awk -v vawk=xxx '$0 ~ vawk {c++} c>0 {print ARGV[1] ; exit 0 } END { if (! c) {exit 1}}' '{}' ';'
who | awk 'BEGIN { printf "(" } { printf "%s", $1 } END { printf ")\n" }'
ls -l | awk '{ system("commande bash"$1); print ...; }'
ls -l | awk '{
cmd = "echo "$0" | tr \" \" \"\n\" | wc -l"
cmd | getline nbSpaces
close(cmd)
if (nbSpaces == 8)
print ...;
else
print ...;
}'
awk '/occurence/{ print NR; exit }' fichier.txt
|
 |
- print: affichage simple avec retour à la ligne.
- printf: affichage avec substitution sans retour à la ligne.
|
Variables
FS |
input Field Separator (espace par défaut)
|
OFS |
Output Field Separator (espace par défaut)
|
RS |
input Record Separator (retour à la ligne par défaut)
|
ORS |
Output Record Separator (retour à la ligne par défaut)
|
NR |
Number of Records being processed
|
NF |
Number of Fields in the current record
|
sed (Stream EDitor)
regex
[0-9] [[:digit:]] |
chiffre, \d n'existe pas
|
\s |
espace, tab
|
\w |
character [0-9a-zA-Z_]
|
- Mode basic regex, échapper ? + { } , \( \) sont utilisés pour les groupes
- Mode extended regex -r, échapper ( ) car utilisés pour les groupes
Remplacer du texte
Manipulation de chaînes de caractères permettant de remplacer des occurrences dans un flux de texte.
|
sed "s/occurrence à remplacer/texte de substitution/drapeaux" -i fichier-cible.txt
sed "s/occurrence à remplacer/texte de substitution/drapeaux" fichier-cible.txt
sed "s/\(groupe 1\) \(groupe 2\)/\1 \2/" -i fichier-cible.txt
sed "s/[0-9]\+\.[0-9]\{1,2\}/ /" -i fichier-cible.txt
sed 's#occurrence à remplacer#texte de substitution#drapeaux' -i fichier-cible.txt
echo 'texte' | sed 's/occurrence à remplacer avec un simple quote \x27/texte de substitution/'
sed 's/$/\\/' fichier.txt
echo '123\\456' | sed 's/\\/+/'
echo '123\\456' | sed "s/\\\\/+/"
sed 's/regex1/txt1/; s/regex2/txt2/;' fichier.txt
sed '
s/regex1/txt1/
s/regex2/txt2/' \
-i fichier.txt
|
Drapeaux :
- g (global) : remplacement de toutes les occurrences, par défaut seule la première est remplacée
- I (case-Insensitive)
- M (Multi lines) : ^ et $ désignent respectivement le debut et la fin d'une ligne, par défaut ils désignent le début et la fin du flux de texte.
 |
Il est possible d'utiliser un autre caractère de séparation que / au cas où celui-ci serait déjà présent dans le texte et qu'il serait impossible ou fastidieux à échapper.
sed -i "s|aaa|bbb|" fichier |
 |
sed fait un traitement ligne par ligne, dans le cas d'une expression rationnelle sur plusieurs lignes envisager un autre outils. |
 |
Dans le cas où le texte de remplacement contiendrait un retour à la ligne
- pour un texte encadré par ', utiliser un \ avec un retour à la ligne
- pour un texte encadré par ", utiliser un \n
|
|
sed -n -r 's/regex (groupe) regex/\1/p' fichier.txt
grep -Eo 'regex'
|
Insérer du texte
|
sed '/regex/i texte à insérer' -i fichier.txt
sed '/regex/a texte à insérer' -i fichier.txt
sed '/regex/i \
texte\
multi-lignes' -i fichier.txt
sed '2i texte à insérer' -i fichier.txt
sed '/regex/i texte à insérer' -i fichier.txt
sed '/regex/i texte à insérer' -i.bak fichier.txt
|
Supprimer des lignes
|
sed '/occurrence de la ligne a supprimer/d' -i fichier.txt
sed '\|occurrence de la ligne a supprimer|d' -i fichier.txt
sed '1d' -i fichier-cible.txt
sed '1d;$d' -i fichier.txt
sed '2,4d' -i fichier.txt
sed '1!d' -i fichier.txt
line_number_to_delete=$(awk '/occurrence/{ print NR; exit }' fichier.txt)
if [ -n "${line_number_to_delete}" ] && (( line_number_to_delete != 0 )); then
sed "$line_number_to_delete,$(( line_number_to_delete + 5 ))d" -i fichier.txt
fi
|
Erreurs
sed: couldn't open temporary file /path/sedlCpwu7: Permission denied
sed doit avoir les droits d'écriture dans le dossier du fichier à modifier pour créer un fichier temporaire.
|
sed '2i text' /path/file > /tmp/file
cat /tmp/file > /path/file
rm /tmp/file
|
wc
Compte le nombre de lignes, de mots, de caractères
|
ps -e | grep X | wc -l
echo $(wc -l < mon-fichier.txt)
echo "123" | wc -m
|
Remplacement caractère par caractère.
|
echo 'un petit texte' | tr ' ' '\n' | wc -l
|
tail
|
tail -f fichier.log
tail fichier.txt
tail -n +5 fichier.txt > fichier_réduit.txt
|
head
|
ls -at | head -n 5
|
tac
Inverse de cat: affiche le contenu d'un fichier de la dernière ligne à la première.
rev
Lit les lignes à l'envers
|
cat mon-fichier.txt | rev
|
paste
Concaténation de 2 fichiers ligne par ligne
|
paste 1.txt 2.txt -d ';'
|
Manipulation de donnée JSON.
|
echo '{"un":"1","deux":"2"}' | jq
echo '{"un":"1","deux":"2"}' | jq .deux
echo '{"un":"1","deux":"2"}' | jq -r .deux
echo '{"un":"1","deux":"2"}' | jq '.[]'
echo '{"un":"1","deux":"2"}' | jq 'keys | .[]'
jq -r '.backup | .[]' backup_pc_folders.json | \
xargs -I '{}' -P 4 -t bash -c "echo '{}'"
jq -r '.backup | .[]' backup_folders.json |
while read -r folder; do
echo $folder
done
jq -r '.[]|[.name, .value] | @tsv' MyAppSettings.json |
while IFS=$'\t' read -r name value; do
echo $name - $value
done
IFS=$'\n' read -r -d '' -a my_array < <(jq -r '.key | .[]' file.json && printf '\0')
|
sort
Trie la sortie d'une commande
|
fc-list : family | sort -f
sort -k 3,3 -k 2M -k 1
du -h dossier | sort -h
|
- -f → ignore la casse
- -M → comparer les mois
- -r → inverse les résultats
- -k → trie par rapport à un élément
- --debug → affiche l'élément qui a servit au trie
- -h, --human-numeric-sort → compare human readable numbers (e.g., 2K 1G)
- -R, --random-sort → mélange aléatoirement au lieu de trier
Manipulation de fichiers / dossiers
cd
|
cd -
|
ls
-a |
do not ignore entries starting with .
|
-A |
do not list implied . and ..
|
-l |
use a long listing format
|
-o |
like -l, but do not list group information
|
-r |
reverse order while sorting
|
-t |
sort by modification time, newest first
|
-S |
sort by file size, largest first
|
-h |
print human readable sizes
|
|
ls -d */ | cut -f1 -d'/'
ls -lhS
ls -thor
|
Modern replacement for ls.
|
exa -1 --icons
exa -lg --icons
exa -lgaa --icons
|
mv
|
mv /chemin1/dossier1 /chemin2/dossier2
mv -T /chemin1/dossier1 /chemin2/dossier2
|
cp
|
cp -r /folder1 /folder2
cp -r /folder1/. /folder2
|
rm
|
shopt -s extglob
rm -i !(file1|file2).txt
shopt -u extglob
setopt extended_glob
rm -i -- ^(file1|file2).txt
|
|
trash-put [filename]
trash-restore
trash-empty
trash-list
|
fd [-HIEsiaLp0hV] [-d depth] [-t filetype] [-e ext] [-E exclude] [-c when] [-j num] [-x cmd] [pattern] [path]
|
fd -e png
fd '^\w{2,3}\.json$'
fd -t f
fd -H xxx
fd -I xxx
fd '*.bak' -E /mnt/external-drive
fd -t f '^\w{2,3}(-\w+)?\.json$' -E fr.json -E en.json -X rm -f
|
 |
fd peut être masqué par le plugin zsh common-aliases (fichier ~/.oh-my-zsh/plugins/common-aliases/common-aliases.plugin.zsh) |
find
|
find / -name 'libpcre*'
find / -name 'libpcre*' 2>&1 | grep -v 'Permission denied'
find / -maxdepth 1 -type d
find . -name '*.exe' -or -name '*.so'
find . -regex '.*\(so\|exe\)$'
find . \! -name '*.exe' \! -name '*.so'
find . -type f -mtime +7 -name '*.gz' -delete
find . -type f -exec awk '/regex/ {c++} c>0 {print ARGV[1] ; exit 0 } END { if (! c) {exit 1}}' \{\} \;
find / -type f -ls -mmin -1
|
diff
|
diff -u /path1/file1.txt /path2/file2.txt > /path3/patch.diff
patch /path1/file1.txt < /path3/patch.diff
|
Disc usage
df
Displays the amount of space available on the file systems
|
df -hl -x tmpfs -x devtmpfs -x overlay
|
du
- -s, --summarize : display only a total for each argument
- -h, --human-readable: print sizes in human readable format (e.g., 1K 234M 2G)
|
du -hs dossier
|
|
dust -br /path
dust -brd 1 /path
dust -brn 10 /path
cargo install du-dust
|
chmod
|
chmod 644 fichier-ou-dossier
chmod u+w fichier-ou-dossier
chmod -w dossier/*
chmod -R -w dossier
chmod g=u fichier-ou-dossier
find /chemin/vers/un/dossier/ -type d -print0 | xargs -0 chmod 755
find /chemin/vers/un/dossier/ -type f -print0 | xargs -0 chmod 644
|
Droits d'endossement: suid, sgid et stiky bit
suid
|
s à la place du x du propriétaire: rwsr-xr-x → 4755 (suid=4)
|
Un programme lancé avec ce droit suid sera exécuté avec les droits du propriétaire du programme et non les droits de l'utilisateur qui l'a lancé.
|
sgid
|
s à la place du x du groupe: rwxr-sr-x → 2755 (sgid=2)
|
Un programme lancé avec ce droit sgid sera exécuté avec les droits du groupe du programme et non les droits du groupe de l'utilisateur qui l'a lancé.
Les fichiers nouvellement créés auront le goup id du dossier.
|
stiky bit
|
t à la place du x des autres: rwxr-xr-t → 1755 (stiky bit=1)
|
Dans un répertoire avec ce droit stiky bit, seuls les propriétaires des fichiers pourront les effacer.
|
 |
S'il n'y avait pas de droit d'exécution x avant d'appliquer ces droits, les lettres s et t seront mises en majuscule. |
chown
|
chown user:group fichier-ou-dossier
chown --from=1000:1000 root:root fichier-ou-dossier
|
chgrp
|
chgrp group fichier-ou-dossier
chown :group fichier-ou-dossier
|
ACL - Access Control Lists
|
getfacl /path
setfacl -R -m u:myuser:rw /path/folder
setfacl -R -m g:mygroup:rwx /path/folder
setfacl -b /path/folder
|
Connaitre le type MIME d'un fichier
|
xdg-mime query filetype fichier.ext
file -b -i fichier.ext
|
A cat clone with syntax highlighting and Git integration.
|
bat /path/file.ext
|
.zshenv
|
export MANPAGER="sh -c 'col -bx | bat -l man -p'"
|
Archivage
tar
|
tar xvf archive.tar.gz
tar xvf archive.tar.gz -C /mon_dossier
tar czf Archive.tar.gz fichier1.txt fichier2.txt *.sh
tar cvzf archive.tar.gz mon_dossier
tar cvzf archive.tar.gz --exclude={mon_dossier/mon_sous_dossier1/*,mon_dossier/mon_sous_dossier2/*} mon_dossier
tar cvzf archive.tar.gz fichier1.ext fichier2.ext --remove-files
tar cf MonDossier.tar MonDossier
tar cf Fichiers.tar fichier1.txt fichier2.txt *.sh
tar cf - MonDossier | 7z a -si MonDossier.tar.7z
tar cf Archive.tar.gz -I pigz Dossier1 Dossier2 Fichier1
tar cf - Dossier1 Dossier2 Fichier1 | pigz > Archive.tar.gz
tar xf Archive.tar.gz -I pigz
tar cf - MonDossier | pigz | openssl aes-256-cbc -pass pass:mon_mot_de_passe > MonDossier.tar.gz.enc
openssl aes-256-cbc -d -pass pass:mon_mot_de_passe -in MonDossier.tar.gz.enc | tar -xz -f -
|
- x : extract files from an archive
- c : create archive from files
- f : use archive file
- v : verbosely list files processed
- z : gzip
- j : bzip (bz2)
- --exclude-vcs : exclude Version Control System like .git
 |
tar peut deviner le décompresseur à utiliser (gzip, bzip, etc). Il n'est donc pas nécessaire de spécifier les options correspondantes (z, j) |
 |
gzip est plus rapide que bzip2 mais compresse moins. |
Suppression de « / » au début des noms des membres
tar supprime le « / » au début des noms de dossiers et fichiers à archiver. Ceci afin d'éviter d'écraser des dossiers et fichiers systèmes lors de la décompression.
Pour éviter ce comportement, il faut utiliser des chemins relatifs au lieu de chemins absolus.
unzip
|
unzip fichier.zip
|
gzip
|
gzip -dk archive.gz
gzip -dkc archive.gz > /ailleurs/fichier
gzip -k fichier.txt
|
 |
gzip ne peut compresser qu'un seul fichier. C'est pourquoi il est utilisé en combinaison avec tar |
7zip
|
7z a archive.7z folder1 file1.ext
7z x MonArchive.7z -oFolder
7z x MonArchive.7z -so > file.ext
tar cf - MonDossier | 7z a -si MonDossier.tar.7z
7z x -so MonDossier.tar.7z | tar xf -
|
Avec Cygwin:
|
seven-zip=$(cygpath -u "C:\Program Files\7-Zip\7z.exe")
"$seven-zip" a -tzip archive.zip Dossier Fichier.ext
|
 |
Les archives zip avec un cryptage AES-256 et un mot de passe ne peuvent être déchiffrées nativement sous Windows |
|
pigz file.txt
pigz -c file.txt > archive.gz
pigz -d file.txt.gz
tar cf - directory/ | pigz > directory.tar.gz
tar --use-compress-program=pigz -cf directory.tar.gz directory/
|
Network
wget
|
wget http://...MonFichier.ext
wget http://...MonFichier.ext -P /path
wget http://...MonFichier.ext -0 chemin/AutreNom.ext
wget http://...MonFichier.ext -0 -
wget -m -A jpg,gif http://site.fr/
wget -r -np http://site.fr/dossier/
wget --spider -q http://...MonFichier.ext
if [ $? == 0 ]
wget --spider -q http://...MonFichier.ext && echo ok || echo ko
|
-P |
Set directory prefix to prefix, default is . (the current directory).
|
--max-redirect=0 |
empèche les redirection 302 Moved Temporarily
|
--no-verbose |
réduit les commentaires de sortie
|
-q |
pas d'affichage en sortie
|
--referer= |
spécifie l'url de la page qui demande le téléchargement du fichier
|
-e robots=off |
ignorer les instructions du fichier robots.txt
|
-np |
ne pas récupérer des éléments du dossier parent
|
--user-agent= |
faire passer wget pour un navigateur web
Firefox - Linux 32 : Mozilla/5.0 (X11; Linux i686; rv:20.0) Gecko/20100101 Firefox/20.0
Internet Explorer 10 - Windows 7 32 : Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)
|
--limit-rate=50k |
limite la vitesse de téléchargement
|
-nd |
dans le cas d'un téléchargement récursif, pas de création de la hiérarchie de dossiers
|
EXIT STATUS
0 No problems occurred.
1 Generic error code.
2 Parse error---for instance, when parsing command-line options, the .wgetrc or .netrc...
3 File I/O error.
4 Network failure.
5 SSL verification failure.
6 Username/password authentication failure.
7 Protocol errors.
8 Server issued an error response.
curl
wget vs curl
|
curl http://www.domain.fr/file.txt > file.txt
|
 |
Récupérer la commande curl équivalente:
Firefox → Ctrl+Shift+q (Network in Developer Tools) → Reload
Clique-droit sur une ligne → copy as cURL |
Autres
date
|
date +%Y-%m-%d
date -d "yesterday" +%Y-%m-%d
|
secret-tool
Accès à Gnome Keyring
|
secret-tool store --label='MySQL' server mysql user root key password
secret-tool lookup server mysql user root key password
|
 |
Si plusieurs entrées correspondent aux clé→valeur, la première est retournée. |
|
xdotool key ctrl+v Return
xdotool key --delay 0 --clearmodifiers ctrl+v
xdotool keydown alt key Tab; sleep .1; xdotool keyup alt
xdotool click 1
xdotool search --class 'My window class' windowactivate --sync key Right
|
 |
Use xprop to get info on a window (name, class) |
Cela permet de fermer le terminal en laissant le processus tourner.
|
nohup [commande] &
bg
disown
|
Clipboard
|
echo test | xclip -selection clipboard
echo test | xclip
cat photo.png | base64 | xclip
echo '# clique-milieu pour coller
' | base64 -d > photo.png
|
rsvg-convert
Convertir une image SVG en PNG
|
rsvg-convert -w $size -h $size fichier.svg > fichier.png
|
FTP
Les options de ftp : v → verbeux, n → désactive auto-login (lecture d'informations dans le fichier ~/.netrc)
|
#!/bin/bash
ftp -vn << EOF
open bananeatomic.free.fr
quote user bananeatomic
quote pass ****
cd dossier_destination
passive
ascii
put chemin_fichier_local [chemin_fichier_destination]
bye
EOF
|
|
echo "un petit texte" | hl -3r texte
echo "un petit texte" | hl -e -3g '\<\w*e\w*\>'
df -h | hl --df
USE_HL=no df -h
yay --editmenu -S hl-git
|
/etc/default/hl
|
pacman :
-e
-3g '^\S[^/]+/([^ ]+)'
|
 |
Pour faciliter la coloration, des scripts encapsulent les commandes à colorer.
Ces scripts sont placés dans /usr/lib/hl_bin et PATH est modifié pour que les nouveaux scripts aient la préséance sur les commandes. |
|
echo -e "$(tput bold; tput setaf 3;)\n= Title =\n$(tput sgr0)"
|
Capname
|
Description
|
bold |
start bold text
|
smul |
start underlined text
|
rmul |
end underlined text
|
setaf |
set foreground color
|
setab |
set background color
|
sgr0 |
turn off all attributes
|
Color
|
Code
|
black |
0
|
red |
1
|
green |
2
|
yellow |
3
|
blue |
4
|
magenta |
5
|
cyan |
6
|
white |
7
|
default |
9
|
sleep, timeout
|
sleep 1 && echo ok
timeout 1 sleep 2 && echo ok || echo ko
|
Allow to run commands in parallel. The GNU Parallel tool needs to be installed.
|
ls *.mp4 | sed -n 's/\.mp4$//p' | parallel echo "{}.avi"
|
Simplified and community-driven man pages with practical examples.
|
tldr [command]
|
|
xml ed -u "/query" --value "new value" file.xml
|
Global option
|
Description
|
L |
edit file inplace
|
S |
preserve non-significant spaces
|
O |
omit XML declaration (<?xml ...?>)
|
script / scriptreplay
|
script -q -c '[command]' [output-file]
cat [output-file]
script -T [time-file] [output-file]
scriptreplay -t [time-file] [output-file]
|