L’attractivité de l'économie de la Birmanie

Le script BASH

Télécharger le script

Ce script a été relancé de nombreuses fois, au fur et à mesure de son évolution.

Compte tenu que nous devions également l’exécuter sur différents ordinateurs, avec différents environnements, nous nous sommes vite aperçues, que la commande sh n’était pas opérante sur tous les systèmes et que pour s’assurer que chacune d’entre nous puisse faire fonctionner le script sous bash, il fallait donc utiliser la commande bash pour exécuter notre script.

De plus, nos url ont évolué dans le temps. Certaines ont disparu (pas trop, il faut le dire, nous avons été assez chanceuses…), d’où la nécessité de nous assurer d’avoir des dossiers propres et donc de vider les dossiers de fichiers dumps et html, à chaque réexécution du script.

Nous avons appris à utiliser des indices, en effet, 4 variables de comptage nous ont été nécessaires (i pour compter les tableaux, j pour compter les liens, k pour compter les dump-utf8 et l pour compter les contextes …).

Nous savions, dès l’origine de notre projet, que le birman n’allait pas être « chose simple », mais nous tenions à traiter toutes les langues ensemble dans le même script. Grâce au birman (qui nécessite des recherches en Unicode), nous avons découvert la commande pcregrep (Perl Compatible Regular Expressions grep) qui nous a permis de traiter notre fichier motifsall.txt, contenant les motifs à rechercher en contexte :

inver|invest|\xe1\x80\x85\xe1\x80\xae\xe1\x80\xb8\xe1\x80\x95\xe1\x80\xbc\xe1\x80

inver (base pour l’espagnol / invertir, inversion, inversor)

invest (base pour l’anglais, l’allemand, le français, le norvégien et le tchèque)

\xe1\x80\xae\xe1\x80\xb8\xe1\x80\x95\xe1\x80\xbc\xe1\x80 encodage en Zawgyi du mot birman စီးပြားေရး (économie).

Ces motifs se trouvent dans un fichier à part, motifsall.txt, ce qui permet d’utiliser le script pour traiter d’autre motifs à l’avenir.

En ce qui concerne la détection d'encodage des pages html, nous avons constaté que les déclarations d’encodage ne sont pas toujours fiables, surtout nous avons souvent remarqué des déclarations UTF-8 pour des pages qui ne l’étaient pas. Comme nous avons évoqué ailleurs, la détection de l'UTF-8 pour le birman n'est pas suffisante pour établir le système d'encodage utilisé. La conversion entre les différents systèmes birmans n'étant pas possible automatiquement, nous avons laisse la mention UTF-8 pour ces pages. La commande iconv n’a pas non plus été fiable à 100%. Certains encodages n’ont pas été correctement reconnus et de ce fait mal convertis.

De plus amples commentaires se trouvent à l'intérieur du script :

  1. #!/bin/bash
  2. # Variables d'environnement
  3. Contextes=../CONTEXTES;
  4. DumpInitial=../DUMPINITIAL;
  5. FichiersGlobaux=../FICHIERSGLOBAUX;
  6. PagesAspirees=../PAGES-ASPIREES;
  7. DumpUTF8=../DUMP-UTF8;
  8. DossierTableau=../TABLEAUX;
  9. URLS=../URLS;
  10. # NOM de la variable html où seront stockées les liens
  11. Tableau1=$DossierTableau/Tabcurl.html;
  12. # Fichiers globaux
  13. DumpsGlobaux=$FichiersGlobaux/DUMPS-GLOBAUX.txt
  14. ContextesGlobaux=$FichiersGlobaux/CONTEXTES-GLOBAUX.txt
  15. # Vider les dossiers dans lesquels nous mettons les fichiers dump et les fichiers html récupérés par curl
  16. # afin de s'assurer d'avoir des dossiers propres (compte tenu du nombre de fois que nous allons relancer le script)
  17. if [[ -d $Contextes ]]
  18.     then
  19.     rm -f $Contextes/*;
  20. else
  21.     mkdir $Contextes;
  22. fi
  23. if [[ -d $DumpInitial ]]
  24.     then
  25.     rm -f $DumpInitial/*;
  26. else
  27.     mkdir $DumpInitial;
  28. fi
  29. if [[ -d $FichiersGlobaux ]]
  30.     then
  31.     rm -f $FichiersGlobaux/*;
  32. else
  33.     mkdir $FichiersGlobaux;
  34. fi
  35. if [[ -d $PagesAspirees ]]
  36.     then
  37.     rm -f $PagesAspirees/*;
  38. else
  39.     mkdir $PagesAspirees;
  40. fi
  41. if [[ -d $DumpUTF8 ]]
  42.     then
  43.     rm -f $DumpUTF8/*;
  44. else
  45.     mkdir $DumpUTF8;
  46. fi
  47. if [[ ! -d $DossierTableau ]]
  48.     then
  49.     mkdir $DossierTableau;
  50. fi
  51. # CREATION DU TABLEAU HTML
  52. echo "<html>" > $Tableau1;
  53. echo "<head>" >> $Tableau1;
  54. echo "<title>tableau de liens</title>" >> $Tableau1;
  55. echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />" >> $Tableau1;
  56. echo "</head>" >> $Tableau1;
  57. echo "<body>" >> $Tableau1;
  58. # Liens vers les fichiers globaux
  59. echo "<p><a href=\"$DumpsGlobaux\" target="_blank">Dump global</a></p>" >> $Tableau1;
  60. echo "<p><a href=\"$ContextesGlobaux\" target="_blank">Contextes globaux</a></p>" >> $Tableau1;
  61. echo "<p align=\"center\"><hr color=\"blue\" width=\"50%\"/></p>" >> $Tableau1;
  62. # Variable i pour compter les tableaux
  63. i=1
  64. # Variable j pour compter les liens
  65. j=1;
  66. # Variable k pour compter les dump-utf8
  67. k=0;
  68. # Variable l pour compter les contextes
  69. l=0;
  70. # 1ère boucle - lit les fichiers du dossier URLS
  71. for fichierURL in `ls $URLS`
  72. do
  73.     # CREATION DES TABLEAUX et de leur en-tête en caractères gras
  74.     echo "    <table align=\"center\" border=\"1\">" >> $Tableau1;
  75.     echo "      <tr>" >> $Tableau1;
  76.     # Modification de l'instruction colspan = 9 au lieu de 6 précédemment
  77.     # (3 nouvelles colonnes = CONTEXTES, CONTEXTES HTML et Nb occurrences°
  78.     echo "        <td colspan=\"9\" align=\"center\" bgcolor=\"black\"><font color=\"white\"><b>L'ATTRACTIVITE \
  79.         ECONOMIQUE DE LA BIRMANIE - $i - $fichierURL</b></font></td>" >> $Tableau1;
  80.     echo "      </tr>" >> $Tableau1;
  81.     echo "      <tr>" >> $Tableau1;
  82.     echo "        <td align=\"center\" width=\"50\">N°URL</td>" >> $Tableau1;
  83.     echo "        <td align=\"center\">URL</td>" >> $Tableau1;
  84.     echo "        <td>PAGE ASPIREE</td>" >> $Tableau1;
  85.     echo "        <td>CODE<br /> RETOUR</td>" >> $Tableau1;
  86.     echo "        <td>DUMP INITIAL</td>" >> $Tableau1;
  87.     echo "        <td>DUMP UTF-8</td>" >> $Tableau1;
  88.     # création de la colonne CONTEXTES
  89.     echo "        <td>CONTEXTES</td>" >> $Tableau1;
  90.     # création de la colonne CONTEXTES HTML
  91.     echo "        <td>CONTEXTES HTML</td>" >> $Tableau1;
  92.     # création de la colonne Nb OCCURRENCES
  93.     echo "        <td>NB OCCUR</td>" >> $Tableau1;
  94.     echo "      </tr>" >> $Tableau1;
  95.    
  96. # Récupération des motifs, codés en dur, pris du fichier "motifsall.txt"
  97. # motifsall.txt = inver|invest|\xe1\x80\x85\xe1\x80\xae\xe1\x80\xb8\xe1\x80\x95\xe1\x80\xbc\xe1\x80
  98. motiffile=./motifsall.txt;
  99. motif=`cat motifsall.txt`;
  100. echo $motif | sed 's/\\/\\\\/g' | sed 's/|/\\|/g' > motifsallsed.txt;
  101. motifsed=`cat motifsallsed.txt`;
  102.    
  103.     for nom in `cat $URLS/$fichierURL`
  104.     do
  105. echo $j;
  106.         # RECUPERATION DU CODE RETOUR HTTP par CuRL et
  107.         # CREATION des PAGES ASPIREES comptées avec la variable j
  108.         coderetour=$(curl -L -m 100 -w %{http_code} -o $PagesAspirees/$j.html $nom);
  109.         # TEST si coderetour = 200
  110.         if [[ "$coderetour" -eq "200" ]]
  111.             then
  112.        
  113.             # LYNX création du DUMP initial ET affichage de l'encodage de la page
  114.             # récupération dans la variable codage de l'encodage des PAGES ASPIREES
  115.             codage=$(file -i $PagesAspirees/$j.html | cut -f 2 -d=)
  116.             # Test de reconnaissance par iconv du codage récupéré
  117.             if [[ -z `iconv -l | grep -i $codage` ]]
  118.                 # sinon nouvelle recherche du codage avec egrep
  119.                 then
  120.                 codage=""
  121.                 codage=`head -n 109 $PagesAspirees/$j.html | \
  122.                     egrep -io "http-equiv.[^<]*+charset[ ]?= *?[^>]['\"]?[_a-zA-Z0-9\-]*" | \
  123.                     sort -u |cut -d \" -f 4 | cut -d= -f 2`
  124.             fi
  125.            
  126.             # Exécution de LYNX suite au 1er TEST
  127.             if [[ -z `iconv -l | grep -i $codage` ]]
  128.                 then
  129.                 lynx -dump $PagesAspirees/$j.html > $DumpInitial/$j.txt;
  130.             # Exécution de LYNX suite au 2ème TEST
  131.             else
  132.                 lynx -display_charset=$codage -dump $PagesAspirees/$j.html > $DumpInitial/$j.txt;
  133.             fi
  134.            
  135.             # REMPLISSAGE DU TABLEAU avec les données récupérées
  136.             # Première colonne
  137.             echo "      <tr>" >> $Tableau1;
  138.             echo "        <td align=\"center\" width=\"50\">$j</td>" >> $Tableau1;
  139.             # Deuxième colonne
  140.             echo "        <td align=\"center\"><a href=\"$nom\" target="_blank">Lien $j</a></td>" >> $Tableau1;
  141.             # Troisième colonne
  142.             echo "        <td><a href=\"$PagesAspirees/$j.html\" target="_blank">PAGE ASPIREE n° $j</a></td>" >> $Tableau1;
  143.             # Quatrième colonne (CODE RETOUR)
  144.             echo "        <td align=\"center\">$coderetour</td>" >> $Tableau1;
  145.             # Cinquième colonne (DUMP INITIAL)
  146.             echo "        <td><a href=\"$DumpInitial/$j.txt\" target="_blank">DUMP INITIAL<br />$codage</a></td>" >> $Tableau1;
  147.             # Sixième colonne (DUMP UTF-8)
  148.             if [[ $codage == "utf-8" ]];
  149.                 then
  150.                 cp $DumpInitial/$j.txt $DumpUTF8/$j.txt
  151.                 let "k+=1";
  152.                 echo "        <td><a href=\"$DumpUTF8/$j.txt\" target="_blank">DUMP UTF-8</a></td>" >> $Tableau1;
  153.                 codage=""
  154.             elif [[ -z `iconv -l | grep -i $codage` ]]
  155.                 then
  156.                 cp $DumpInitial/$j.txt $DumpUTF8/$j.txt
  157.                 let "k+=1";
  158.                 echo "        <td>codage non reconnu<br><a href=\"$DumpUTF8/$j.txt\" target="_blank">copié quand même...</a></td>" \
  159.                     >> $Tableau1;
  160.             else
  161.                 iconv --from-code $codage --to-code utf-8 --output $DumpUTF8/$j.txt $DumpInitial/$j.txt
  162.                 let "k+=1";
  163.                 echo "        <td><a href=\"$DumpUTF8/$j.txt\" target="_blank">DUMP UTF-8</a></td>" >> $Tableau1;
  164.             fi
  165.             if [[ -f $DumpUTF8/$j.txt ]]
  166.                 then
  167.                 cat $DumpUTF8/$j.txt >> $DumpsGlobaux;
  168.                 cat $DumpUTF8/$j.txt >> $FichiersGlobaux/dump-$i.txt
  169.             fi
  170.             # Septième colonne (CONTEXTES)
  171.             sed -e '/\(https:\/\/\)/d' -e '/\(http:\/\/\)/d' -e '/\(file:\/\/\)/d' \
  172.                 -e '/mailto:/d' -e 's/^[ \t]*//;s/[ \t]*$//' $DumpUTF8/$j.txt > $Contextes/resultat.txt
  173.            
  174.             pcregrep -C 1 -i --colour "$motif" $Contextes/resultat.txt > $Contextes/$j.txt
  175.             if [[ -s $Contextes/$j.txt ]]
  176.                 then
  177.                 containsText=1;
  178.             else
  179.                 rm -f $Contextes/$j.txt;
  180.                 containsText=0;
  181.             fi
  182.             rm -f $Contextes/resultat.txt
  183.             if [[ containsText -eq 1 ]]
  184.                 then
  185.                 echo "        <td><a href=\"$Contextes/$j.txt\" target="_blank">CONTEXTES</a></td>" >> $Tableau1;
  186.                 cat $Contextes/$j.txt >> $ContextesGlobaux
  187.                 cat $Contextes/$j.txt >> $FichiersGlobaux/contextes-$i.txt
  188.             else
  189.                 echo "        <td bgcolor=\"yellow\">&nbsp;</td>" >> $Tableau1;
  190.             fi
  191.             # Huitième colonne (CONTEXTES HTML)
  192.             # On commence le traitement avec minigrep que si l'on a trouve qqch avec le grep
  193.             # Afin de pouvoir traiter quelques URL en Birman, il nous a fallu utiliser une autre commande
  194.             # pcregrep - commande à l'origine de Perl, utilisable en Bash pour un "grep" d'E.R.
  195.             # le motif en Birman étant une chaine de caractères en UTF-8
  196.             if [[ containsText -eq 1 ]]
  197.                 then
  198.                 CONTEXTTEXT="";
  199.                 # Utilisation de la commande sed pour éviter les liens http, https, file et mailto présents sur nos pages
  200.                 pcregrep -ni "$motif" $DumpUTF8/$j.txt | sed "s/\($motifsed\)/<font color=\"red\">&<\/font>/Ig" | sed 's/$/<br>/g' | \
  201.                     sed -e '/\(https:\/\/\)/d' -e '/\(http:\/\/\)/d' -e '/\(file:\/\/\)/d' \
  202.                         -e '/mailto:/d' -e 's/^[ \t]*//;s/[ \t]*$//' > resultat-extraction.txt
  203.                 if [[ -s resultat-extraction.txt ]];
  204.                     then
  205.                     let "l+=1"
  206.                     echo "        <td>`cat resultat-extraction.txt`</td>" >> $Tableau1;
  207.                 else
  208.                     echo "        <td bgcolor=\"yellow\">&nbsp;</td>" >> $Tableau1;
  209.                 fi
  210.                
  211.                 # neufième colonne (NB OCCUR)
  212.                 countMotif=`pcregrep -io $motif resultat-extraction.txt | wc -w`
  213.                 if [[ $countMotif -eq 0 ]]
  214.                     then
  215.                     echo "          <td bgcolor=\"yellow\">&nbsp;</td>" >> $Tableau1;
  216.                 else
  217.                     echo "        <td align=\"center\">$countMotif</td>" >> $Tableau1;
  218.                 fi
  219.            
  220.                 # on peut supprimer le fichier resultat-extraction.txt
  221.                 if [[ -f resultat-extraction.txt ]]
  222.                     then
  223.                     rm -f resultat-extraction.txt;
  224.                 fi
  225.             else
  226.                 echo "        <td bgcolor=\"yellow\">&nbsp;</td>" >> $Tableau1;
  227.                 echo "        <td bgcolor=\"yellow\">&nbsp;</td>" >> $Tableau1;
  228.             fi
  229.             echo "      </tr>" >> $Tableau1;
  230.             let "j+=1";
  231.         fi
  232.     done
  233.     echo "      <tr>" >> $Tableau1;
  234.     echo "        <td colspan=5>&nbsp;</td>" >> $Tableau1;
  235.     echo "        <td><a href=\"$FichiersGlobaux/dump-$i.txt\" target="_blank">Fichiers DUMP</a>&nbsp;:<br>$k</td>" >> $Tableau1;
  236.     echo "        <td><a href=\"$FichiersGlobaux/contextes-$i.txt\" target="_blank">Fichiers Contextes</a>&nbsp;:<br>$l</td>" >> $Tableau1;
  237.     echo "      </tr>" >> $Tableau1;
  238.     echo "    </table>" >>$Tableau1;
  239.     let "i+=1";
  240.     # Remettre les variables k et l à zero
  241.     k=0;
  242.     l=0;
  243.     echo "    <p align=\"center\"><hr color=\"blue\" width=\"50%\"></p>" >> $Tableau1;
  244. done
  245. echo "  </body>" >>$Tableau1;
  246. echo "</html>" >>$Tableau1;