La commande wc compte le nombre de lignes, de mots et de caractères.
Syntaxe
wc [OPTION]... [FILE]...
Principales options :
-l Compter le nombre de lignes
-w Compter le nombre de mots
-c Compter le nombre d'octets
-m Compter le nombre de caractères
Exemples
Nombre de lignes, mots et caractères du fichier depts2012
$ wc depts2012
99 594 2769 depts2012
$
Nombre de lignes uniquement
$ wc -l depts2012
99 depts2012
$
Nombre de mots uniquement
$ wc -w depts2012
594 depts2012
$
Nombre de caractères uniquement
$ wc -m depts2012
2769 depts2012
$
Nombre de caractères contenus dans un texte saisi au clavier (attention au saut de ligne ajouté par la commande echo)
$ read texte
ceci est un texte
$ echo "$texte" | wc -m
18 # Le saut de ligne est comptabilisé
$ echo -e "$texte\c" | wc -m
17 # Avec l'option -e et \c le saut de ligne n'est pas comptabilisé
$ echo -n "$texte" | wc -m
17 # Idem mais avec l'option -n
$
La commande cut sert à récupérer des caractères ou des champs d'une ligne.
Syntaxe
Couper par caractères
cut -c3 [fichiers ...] | Le 3ème caractère |
cut -c3-5 [fichiers ...] | Du 3ème au 5ème caractère |
cut -c-3 [fichiers ...] | Jusqu'au 3ème caractère |
cut -c3- [fichiers ...] | A partir du 3ème caractère |
cut -c3,10 [fichiers ...] | Le 3ème et le 10ème caractère |
Couper par champs
cut -dsep -f3 [fichiers ...] | Le 3ème champ |
cut -dsep -f3-5 [fichiers ...] | Du 3ème au 5ème champ |
cut -dsep -f-3 [fichiers ...] | Jusqu'au 3ème champ |
cut -dsep -f3- [fichiers ...] | A partir du 3ème champ |
cut -dsep -f3,10 [fichiers ...] | Le 3ème et le 10ème champ |
L'option -d permet d'exprimer le caractère séparateur de champ. Le caractère séparateur par défaut est la tabulation.
Exemples
Couper les 2 Premiers chiffres d'un code postal
$ echo 44150 | cut -c1-2
44
$
Afficher le 1er, 6ème et 7ème champs des 5 dernières lignes du fichier /etc/passwd
$ tail -5 /etc/passwd | cut -d: -f1,6,7
nobody:/nonexistent:/bin/sh
libuuid:/var/lib/libuuid:/bin/sh
postfix:/var/spool/postfix:/bin/false
sshd:/var/run/sshd:/usr/sbin/nologin
mysql:/var/lib/mysql:/bin/false
$
Si le caractère séparateur est un caractère spécial du shell, il faut le protéger.
$ ligne="val1|val2|val3"
$ echo $ligne | cut -d'|' -f1
val1
$
La commande sort permet de trier les lignes d'un flux de données textes.
Syntaxe
sort [options] -k champs[.car] [options], champ[.car] [options] [fichiers ...]
Principales options :
-b : Option à utiliser lorsque le critère de tri est alphanumérique et que les valeurs dans les champs sont calés à droite et complétés avec des espaces à gauche
-k : champ [.car] [options] , champ [.car] [options] Spécifier le ou les champs à prendre en compte en tant que critère de tri. Le critère de tri peut commencer ou finir à une certaine position de caractère du champ.
-n : Préciser que le critère de tri doit être traité comme valeur numérique et non comme chaine de caractères.
-r : Demander un tri décroissant
-t sep : Préciser le caractère séparateur de champs (espace par défaut)
-u : Suppression des doublons
Exemples
Utilisation du fichier /etc/passwd
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
postfix:x:101:104::/var/spool/postfix:/bin/false
sshd:x:102:65534::/var/run/sshd:/usr/sbin/nologin
mysql:x:103:108:MySQL Server,,,:/var/lib/mysql:/bin/false
$
Trier le fichier sans aucune option.
Le fichier est trié en fonction de la première lettre de chaque ligne.
$ sort /etc/passwd
backup:x:34:34:backup:/var/backups:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
games:x:5:60:games:/usr/games:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mysql:x:103:108:MySQL Server,,,:/var/lib/mysql:/bin/false
news:x:9:9:news:/var/spool/news:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
postfix:x:101:104::/var/spool/postfix:/bin/false
proxy:x:13:13:proxy:/bin:/bin/sh
root:x:0:0:root:/root:/bin/bash
sshd:x:102:65534::/var/run/sshd:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
sys:x:3:3:sys:/dev:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
$
Trier le fichier sur le 3ème champ (valeurs numériques).
Le tri est alphanumérique.
$ sort -t: -k 3,3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
postfix:x:101:104::/var/spool/postfix:/bin/false
sshd:x:102:65534::/var/run/sshd:/usr/sbin/nologin
mysql:x:103:108:MySQL Server,,,:/var/lib/mysql:/bin/false
proxy:x:13:13:proxy:/bin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
$
Pour que le tri soit numérique il faut ajouter l'option -n
$ sort -t: -k 3,3 -n /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
postfix:x:101:104::/var/spool/postfix:/bin/false
sshd:x:102:65534::/var/run/sshd:/usr/sbin/nologin
mysql:x:103:108:MySQL Server,,,:/var/lib/mysql:/bin/false
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
$
Exemple de tri sur un fichier dont le champ servant de critère de tri est alphanumérique et complété avec des espaces à gauche.
$ cat listeFic
-rw-r--r-- 1 root root 17 May 17 21:31 fic1
-rw-r--r-- 1 root root 17 May 17 21:36 fic4
-rw-r--r-- 1 root root 23 May 17 21:33 fic2
-rw-r--r-- 1 root root 35 May 19 15:02 fic7
-rw-r--r-- 1 root root 36 May 17 21:52 fic5
-rw-r--r-- 1 root root 40 May 17 21:33 fic3
-rw-r--r-- 1 root root 48 May 19 17:59 fic8
-rw-r--r-- 1 root root 74 May 17 22:01 fic6.txt
$
Tri sur le champ 9. Valeurs alphanumériques complétées avec des espaces à gauche. Sans l'option -b, le tri est mal réalisé.
$ sort -k 9,9 listeFic
-rw-r--r-- 1 root root 17 May 17 21:31 fic1
-rw-r--r-- 1 root root 23 May 17 21:33 fic2
-rw-r--r-- 1 root root 40 May 17 21:33 fic3
-rw-r--r-- 1 root root 17 May 17 21:36 fic4
-rw-r--r-- 1 root root 36 May 17 21:52 fic5
-rw-r--r-- 1 root root 35 May 19 15:02 fic7
-rw-r--r-- 1 root root 48 May 19 17:59 fic8
-rw-r--r-- 1 root root 74 May 17 22:01 fic6.txt
$
Idem mais avec l'option -b
$ sort -b -k 9,9 listeFic
-rw-r--r-- 1 root root 17 May 17 21:31 fic1
-rw-r--r-- 1 root root 23 May 17 21:33 fic2
-rw-r--r-- 1 root root 40 May 17 21:33 fic3
-rw-r--r-- 1 root root 17 May 17 21:36 fic4
-rw-r--r-- 1 root root 36 May 17 21:52 fic5
-rw-r--r-- 1 root root 74 May 17 22:01 fic6.txt
-rw-r--r-- 1 root root 35 May 19 15:02 fic7
-rw-r--r-- 1 root root 48 May 19 17:59 fic8
$
Utilisation de 2 critères de tri: Tri sur le champ 7 (numérique) et sur le champ 9 (alphanumérique)
$ sort -k 7n,7 -k 9b,9 listeFic
-rw-r--r-- 1 root root 74 May 15 22:01 fic6.txt
-rw-r--r-- 1 root root 35 May 15 15:02 fic7
-rw-r--r-- 1 root root 17 May 17 21:31 fic1
-rw-r--r-- 1 root root 23 May 17 21:33 fic2
-rw-r--r-- 1 root root 40 May 17 21:33 fic3
-rw-r--r-- 1 root root 17 May 17 21:36 fic4
-rw-r--r-- 1 root root 36 May 17 21:52 fic5
-rw-r--r-- 1 root root 48 May 19 17:59 fic8
$
Trier un fichier suivant les mois de l'année
$ cat fic91
April
August
December
February
January
July
June
March
May
November
October
September
$
$ sort -M fic91
January
February
March
April
May
June
July
August
September
October
November
December
$
La commande paste concatène les lignes de même niveau des fichiers passés en argument. Avec l'option -s, chaque fichier est traité de manière indépendante et verra toutes ses lignes concaténées en une seule. Les éléments concaténés sont séparés par une tabulation.
Syntaxe
paste [options] [fichiers ...]
Principales options :
-s : Concaténer toutes les lignes en une seule
-d listesep : Les caractères cités dans listesep seront utilisés pour séparer les champs en sortie
Exemple
Exemple avec 2 fichiers contenant les dépenses d'un ménage pour le mois de janvier 2012 et février 2012. Les catégories sont mentionnées dans le même ordre.
$ cat janvier2012
Alimentation 50.00
Eau 25.00
Electricite 123.50
Loyer 456.90
Assurances 234.00
$ cat fevrier2012
Alimentation 67.00
Eau 34.00
Electricite 156.00
Loyer 456.90
Assurances 225.00
$
Mettre sur la même ligne les montants de chaque catégorie.
$ paste janvier2012 fevrier2012
Alimentation 50.00 Alimentation 67.00
Eau 25.00 Eau 34.00
Electricite 123.50 Electricite 156.00
Loyer 456.90 Loyer 456.90
Assurances 234.00 Assurances 225.00
$
Retirer la 3ème colonne et ajouter des en-têtes de colonnes et le total pour chaque mois.
$ paste janvier2012 fevrier2012 | awk 'BEGIN{printf("%-15s\t%7s\t%7s\n","POSTE","JANVIER","FEVRIER")}{printf("%-15s\t%7.2f\t%7.2f\n",$1,$2,$4);jan+=$2;fev+=$4}END{printf("%-15s\t%7.2f\t%7.2f\n","TOTAL",jan,fev)}'
POSTE JANVIER FEVRIER
Alimentation 50.00 67.00
Eau 25.00 34.00
Electricite 123.50 156.00
Loyer 456.90 456.90
Assurances 234.00 225.00
TOTAL 889.40 938.90
$
Concaténer toutes les lignes en une seule.
$ paste -s janvier2012 fevrier2012
Alimentation 50.00 Eau 25.00 Electricite 123.50 Loyer 456.90 Assurances 234.00
Alimentation 67.00 Eau 34.00 Electricite 156.00 Loyer 456.90 Assurances 225.00
$
La commande split permet d'éclater un fichier en fragments. Chaque fragment étant stocké dans des fichiers nommés PREFIXEaa, PREFIXEab, ... PREFIXE ayant pour valeur par défaut "x". Si aucun nom de fichier n'est spécifié, l'entrée standard est utilisée.
Syntaxe
split [options] [fichiers ... [prefixe]]
Principales options :
-b nb : Le fichier est éclaté tous les "nb" octets
-l nb : Le fichier est éclaté toutes les "nb" lignes
Exemples
Exemple avec un fichier contenant 9 lignes
$ cat fic10
ligne1
ligne2
ligne3
ligne4
ligne5
ligne6
ligne7
ligne8
ligne9
$
Eclater le fichier en différents fichiers de 3 lignes chacuns. Par défaut, chaque fichier généré sera préfixé par la lettre "x".
$ split -l3 fic10
$ ls -l x*
-rw-r--r-- 1 root root 21 May 23 08:56 xaa
-rw-r--r-- 1 root root 21 May 23 08:56 xab
-rw-r--r-- 1 root root 21 May 23 08:56 xac
$ cat xaa
ligne1
ligne2
ligne3
$ cat xab
ligne4
ligne5
ligne6
$ cat xac
ligne7
ligne8
ligne9
$
Modifier le préfixe des fichiers générés.
$ split -l3 fic10 fichier
$ ls -l fichier*
-rw-r--r-- 1 root root 21 May 23 08:58 fichieraa
-rw-r--r-- 1 root root 21 May 23 08:58 fichierab
-rw-r--r-- 1 root root 21 May 23 08:58 fichierac
$
La commande tr permet d'appliquer un traitement sur certains caractères d'un flux de données : suppression, substitutions ... Cette commande exploite uniquement les données arrivant sur l'entrée standard.
Syntaxe
tr [options] ensemble1 [ensemble2]
Principale option :
[-d caractères] : La liste des caractères qui doivent être supprimés du flux de données.
Deux ensembles de caractères doivent être spécifiés. Chaque ensemble comporte le même nombre de caractères. Tout caractère de ensemble1 trouvé dans le flux de données est substitué par le caractère de même position situé dans ensemble2.
Exemples
La chaine abcd est traitée : chaque caractère b est remplacé par 2 et chaque caractère d est remplacé par 4.
$ echo abcd | tr bd 24
a2c4
$
Il est possible d'utiliser la notion d'intervalles de caractères en utilisant des crochets. Ici chaque minuscule est remplacée par une majuscule correspondante :
$ echo abcd | tr "[a-z]" "[A-Z]"
ABCD
$
Pour traiter un fichier, il faut utiliser la redirection :
$ cat fic1
ceci est un test
$ tr "[a-z]" "[A-Z]" < fic1
CECI EST UN TEST
$
L'option -d permet de supprimer certains caractères du flux de données.
Exemples
Transformation d'un fichier au format DOS (fin de lignes "\r\n") en un format UNIX ("\n"). Retrait du caractère "\r" :
$ od -c fic100
0000000 c e c i e s t u n t e s t
0000020 \r \n
0000022
$ tr -d '\r' < fic100 > fic101
$ od -c fic101
0000000 c e c i e s t u n t e s t
0000020 \n
0000021
$
En ajoutant l'option -c à l'option -d, la commande supprime tous les caractères non présents dans la liste passée en argument :
$ echo "Linux Pratique HS N°26 – Février/Mars 2013 – En kiosque" | tr -dc a-zA-Z; echo
LinuxPratiqueHSNFvrierMarsEnkiosque
La dernière commande echo permet uniquement d'afficher un retour à la ligne.
La commande uniq permet de dédoublonner les lignes d'un fichier. Seules les lignes identiques consécutives sont traitées. Elle s'utilise le plus souvent à la suite de la commande sort. Le résultat est stocké dans un fichier de sortie, si celui-ci est spécifié, sur la sortie standard dans le cas contraire.
Syntaxe
uniq [options] [fichier_entree [fichier_sortie]]
Principales options :
-d : Affichage des doublons
-c : Comptage des doublons
Exemples
Le fichier fic20 contient des lignes en double
$ cat fic20
ceci est un test
ceci est un test
ceci est un test
ceci est un test
ceci est un autre test
ceci est un test
ceci est un autre test
ceci est un test
ceci est un test
et un autre test
ceci est un fichier
$
Le fichier doit être trié pour que les lignes identiques soient consécutives :
$ sort fic20
ceci est un autre test
ceci est un autre test
ceci est un fichier
ceci est un test
ceci est un test
ceci est un test
ceci est un test
ceci est un test
ceci est un test
ceci est un test
et un autre test
$
Et enfin, suppression des doublons :
$ sort fic20 | uniq
ceci est un autre test
ceci est un fichier
ceci est un test
ceci est un test
ceci est un test
et un autre test
$
Résultat identique avec la commande sort et l'option -u :
$ sort -u fic20
ceci est un autre test
ceci est un fichier
ceci est un test
ceci est un test
ceci est un test
et un autre test
$
Afficher devant chaque ligne son nombre d'occurences dans le fichier :
$ sort fic20 | uniq -c
2 ceci est un autre test
1 ceci est un fichier
5 ceci est un test
1 ceci est un test
1 ceci est un test
1 et un autre test
$
Afficher uniquement les lignes ayant des doublons :
$ sort fic20 | uniq -d
ceci est un autre test
ceci est un test
$
Combinées les options -c et -d :
$ sort fic20 | uniq -cd
2 ceci est un autre test
5 ceci est un test
$
Afficher les lignes uniques :
$ sort fic20 | uniq -u
ceci est un fichier
ceci est un test
ceci est un test
et un autre test
$ sort fic20 | uniq -cu
1 ceci est un fichier
1 ceci est un test
1 ceci est un test
1 et un autre test
$