Commandes Unix
Quelques explications basiques sur les commandes utilisées pour écrire le script (en retraçant doucement les étapes et problèmes évités) :
Commande | Description |
read | read from a file descriptor |
echo | display a line of text |
mkdir | make directories |
curl | transfer an URL -o write output to 'file' |
egrep | print lines matching a pattern -i ignore case distinctions in both the PATTERN and the input files -o print only the matched (non-empty) parts of a matching line, with each such part on a separate output line -c suppress normal output; instead print a count of matching lines for each input file |
file | determine file type -b do not prepend filenames to output lines (brief mode) --mime-encoding causes the file command to output mime type strings and print only the specified element(s) |
lynx | a general purpose distributed information browser for the World Wide Web -dump dumps the formatted output of the default document or those specified on the command line to standard output -nolist disable the link list feature in dumps -display_charset=MIMEname set the charset for the terminal output |
cat | concatenate files and print on the standard output |
iconv | convert encoding of given files from one encoding to another -f encoding convert characters from encoding -t convert characters to encoding if not specified the encoding corresponding to the current locale is used -o file specify output file (instead of stdout) |
sort | sort lines of text files -u output only the first of an equal run |
mv | mv SOURCE DEST Rename SOURCE to DEST |
<meta content=\"text/html\" charset=\"utf-8 \"/>
Ceci n'est pas une commande mais une balise de méta-données qui donne des informations sur l’encodage de la page : c’est de la méta description, pas de la programmation !
Mais il est nécessaire de donner une balise méta pour transmettre au navigateur l'encodage de notre ficher...
echo :
Il est possible de rediriger le flux de sortie, et donc le canal de sortie ne serait plus l'écran mais, par exemple, un fichier.
echo "blah" > toto.txt = le flux de sortie de la commande est redirigé vers le fichier du dossier courant nommé "toto.txt" (créé à l'occasion s'il n'existait pas auparavant).
/!\ Le fichier sera écrasé, c'est-à-dire que tout le contenu sera remplacé par le contenu du flux de sortie.
echo "blah" >> toto.txt = le flux de sortie de la commande echo est redirigé du terminal vers le fichier. Le double chevron permet de ne pas écraser le fichier ; le contenu de la commande sera concaténé à la fin du fichier.
cat :
cat permet ici d'afficher l'ensemble des urls de notre fichier, uniquement parce qu'on a une url par ligne, donc... la ligne devient ici le critère segmenteur !
Nous avions uniquement un fichier d'url, en considérant la liste d'url comme un ensemble, nous avons maintenant un ensemble d'url !
cut :
permet d'extraire des colonnes dans un fichier donné.
cut -f : définit les colonnes qui nous intéressent
cut -d : spécifie les marqueurs de colonne (ou délimiteurs de colonne)
wget -O ou son équivalent curl -o (que nous avons favorisé) :
permet de traiter notre fichier d'url : on aspire chaque page html via son url et on la stocke dans le tableau qui s'en trouve enrichi.
L'avantage de curl c'est qu'il fournit un rapport d'erreur, mais attention :
- le retour d'erreur de curl marchera toujours mais ne garantit pas la récupération du contenu de la page si celle ci est verrouillée !
- pour éviter d'obtenir une "Bad request" (c'est-à-dire un fichier pour lequel il est inutile d'insister : la requête est donnée directement par le serveur), il faut s'assurer de deux choses :
lynx -dump :
- que le code retour de curl = 0
- et condition supplémentaire : que le contenu corresponde à nos attentes.
permet de récupérer le contenu des pages html en format .txt : notre tableau s'en trouve enrichi davantage !
egrep :
Commande de filtrage qui va chercher une chaîne de caractère dans un fichier. Grâce à elle, on épure les pages dumpées avec le mot et son contexte : nous avons un tableau super enrichi.
Quelques options d'egrep :
-c : permet de compter les lignes contenant le motif
-v : permet d'afficher les lignes ne contenant pas le motif
-n : chaque ligne contenant le motif est précédée de son numéro dans le fichier
-i : évite la casse, pas de distinction min/MAJ
-o : affiche toutes les occurrences reconnues du motif
# Par exemple, pour virer les lignes vides d'un fichier :
egrep –v "^$" toto.txt > totosanslignevide.txt
« La vie est simple, parfois » SF
file -i :
permet de donner l'encodage d'un fichier. On a ici une petite difficulté :
le résultat de la commande file -i est produit par le terminal, on doit donc récupérer la chaîne de caractère contenue dans la réponse à l'aide d'une RegExp.
iconv :
permet de transférer un fichier d'un encodage dans un autre.
Expressions régulières
Petit rappel sur les expressions régulières et leurs opérateurs :
Pour traiter une expression régulière, on utilise la commande de filtrage :
egrep [option] "motif" fichier
Concernant le motif à traiter :
egrep "bla" toto.txt
egrep "^L" fichier (^ : début de ligne - ici qui contient une MAJ)
egrep "es$" fichier ($ : fin de ligne /!\ contextuel ! si textuel, désigne la fin de la séquence texte)
egrep "a.me" fichier (. : n'importe quel caractère)
egrep "am+e" fichier (+ : le caractère précédent reproduit une ou plusieurs fois)
egrep "es*,$" fichier (* : le "s" n'est pas obligatoire)
egrep "es?,$" fichier (? : la dernière occurence - ici, le "s" - reproduite ou non)
egrep "^[LN]" fichier ([ ] : soit l'un, soit l'autre, soit l'ensemble)
[a-z] : désigne l'ensemble des minucules
[a-zA-Z] : désigne l'ensemble des caractères en fonction de la locale
egrep "[^0-9]" fichier ([^ ] : a une valeur de négation - ici, tout sauf un chiffre)
egrep "^[^LN]" fichier (ici, on veut tout sauf L ou N en début de ligne)
egrep "eaux$|res$" fichier (lignes qui se terminent par -eaux ou -res)
egrep "\.$" fichier (\ : réattribue caractère DONC ici, lignes qui se terminent par ".")
Opérateurs de base:
\b : début/fin de mot
"\bL" : mot qui commence par "L"
"es\b" : mot qui finit par "es"
"\bL.+es\b" /!\ très dangereux (.+ désigne n'importe quel caractère reproduit une ou plusieurs fois)
"\bL\B+es\b" : petit exercice à décrypter !
\B : dans le mot
\w : n'importe quel caractère alphanumérique
\W : tout ce qui n'est pas un caractère alphanumérique
Quelques exemples d'options :
-i : ne distingue pas min/MAJ
-c : affiche un décompte des lignes comprenant le motif recherché
-n : chaque ligne qui contient le motif est précédée de son numéro dans le fichier
-v : affiche les lignes qui ne contiennent pas le motif
-o : affiche uniquement ce qui a été reconnu (et pas la ligne entière)