IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Comment réécrire cette ligne efficacement ?


Sujet :

Shell et commandes GNU

  1. #1
    Membre expérimenté
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Par défaut Comment réécrire cette ligne efficacement ?
    J'aimerais réécrire cette ligne de code de façon à ce que le | head arrête le process avant le pipe dès qu'il reçoit la première ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    $ time for file in $(command ls -1t /var/log/dovecot.log*); do zgrep --line-buffered -E 'login.*xxx' $file | tail -1; done
    Oct 11 09:58:19 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.106, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Oct 11 03:33:19 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=105.101.229.68, lip=10.10.10.19, lport=143, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Oct 09 18:08:34 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.106, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Oct 06 15:40:23 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.106, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Oct 05 15:33:26 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.106, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Oct 04 18:26:25 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=105.235.131.14, lip=10.10.10.19, lport=143, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Oct 03 10:47:36 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.106, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Oct 02 15:25:28 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.106, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Sep 30 22:54:10 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=105.235.132.20, lip=10.10.10.19, lport=143, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Sep 29 15:06:41 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.105, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Sep 28 08:27:34 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.105, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Sep 27 09:40:33 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.105, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Sep 26 15:29:57 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.105, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Sep 25 16:28:54 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.105, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Sep 22 21:02:17 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=105.235.133.148, lip=10.10.10.19, lport=143, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Sep 21 13:34:07 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.105, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Sep 20 17:23:33 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.105, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Sep 19 12:06:51 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.105, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Sep 18 12:21:34 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.105, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Sep 15 15:18:47 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=10.10.10.19, lip=10.10.10.19, lport=143, service=imap
    Sep 14 17:11:55 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.95, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Sep 13 15:45:08 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.95, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Sep 12 13:45:40 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.95, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Sep 11 17:53:37 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.95, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
     
    real    0m5.367s
    user    0m6.004s
    sys     0m0.356s
    $
    Comme on le vois, la commande prend environ 6 secondes à s'executer lorsqu'il n'y a pas de head.
    Je m'attend à ce que ça prend beaucoup moins de temps lorsqu'il y en a un, comme ici :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $ time for file in $(command ls -1t /var/log/dovecot.log*); do zgrep --line-buffered -E 'login.*a.chaouche' $file | tail -1; done | head -1
    Oct 11 09:58:19 imap-login: Info: Login: user=<xxx@mydomain.tld>, method=PLAIN, rip=192.168.211.106, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
     
    real    0m4.681s
    user    0m5.088s
    sys     0m0.424s
    $
    Au lieu de ça, la commande prend tout de même 5 secondes à s'executer, ce n'est pas énorme en gain de temps.
    Je vois bien la première ligne s'afficher et head qui attend encore, longtemps après la première ligne.

    Une idée ?

    PS : la ligne de code a pour objet de mettre en évidence le dernier login d'un utilisateur au serveur dovecot.
    Pour ce faire, j'ai imaginé une boucle for qui va scanner tous les fichiers de log dovecot dans l'ordre chronologique inverse (plus récent vers plus ancien)
    Je fais un grep sur chaque fichier et j'en prend la dernière ligne.
    De ce fait, si, dans la même journée, une personne se connecte à 09h00 puis à 17h00, c'est 17h00 qui sera affichée.
    Le prochain tour de boucle affichera le dernier login (s'il y en a) de la journée précédente.
    Le | head à la fin devrait donc afficher le tout dernier login.
    S'il y a eu connexion lundi, les fichiers de dimanche, samedi, vendredi... ne devraient pas être scannés.
    Mais j'ai l'impression qu'ils sont tout de même scannés vu le temps que ça prend.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    Par défaut
    Bonjour,

    as-tu essayé zgrep, sans boucle, sans ls... juste zgrep... |head... ?
    parce qu'il y a des chances que les logs soient numérotés, et traités dans l'ordre chronologique.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre expérimenté
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    root@messagerie-principale[10.10.10.19] ~ # zgrep -l --color -E 'login.*a.chaouche' /var/log/dovecot.log*
    /var/log/dovecot.log
    /var/log/dovecot.log.1
    /var/log/dovecot.log.11.gz
    /var/log/dovecot.log.12.gz
    /var/log/dovecot.log.13.gz
    /var/log/dovecot.log.14.gz
    /var/log/dovecot.log.15.gz
    /var/log/dovecot.log.16.gz
    /var/log/dovecot.log.19.gz
    /var/log/dovecot.log.20.gz
    /var/log/dovecot.log.21.gz
    /var/log/dovecot.log.22.gz
    /var/log/dovecot.log.23.gz
    /var/log/dovecot.log.26.gz
    /var/log/dovecot.log.27.gz
    /var/log/dovecot.log.28.gz
    /var/log/dovecot.log.29.gz
    /var/log/dovecot.log.2.gz
    /var/log/dovecot.log.30.gz
    /var/log/dovecot.log.5.gz
    /var/log/dovecot.log.6.gz
    /var/log/dovecot.log.7.gz
    /var/log/dovecot.log.8.gz
    /var/log/dovecot.log.9.gz
    root@messagerie-principale[10.10.10.19] ~ #

  4. #4
    Membre expérimenté
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Par défaut
    Voici une autre trace montrant que même avec mon head tous les fichiers sont scrutés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    $ command ls -1t /var/log/dovecot.log* | while read -r filename; do zgrep -h --line-buffered --color -E 'login.*a.chaouche' $filename | tail -1; echo reading $filename >> /tmp/lastlogin; done | head -1
    Oct 11 09:58:19 imap-login: Info: Login: user=<a.chaouche@mydomain.tld>, method=PLAIN, rip=192.168.211.106, lip=10.10.10.19, lport=993, service=imap, ssl=TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    $ cat /tmp/lastlogin 
    reading /var/log/dovecot.log
    reading /var/log/dovecot.log.1
    reading /var/log/dovecot.log.2.gz
    reading /var/log/dovecot.log.3.gz
    reading /var/log/dovecot.log.4.gz
    reading /var/log/dovecot.log.5.gz
    reading /var/log/dovecot.log.6.gz
    reading /var/log/dovecot.log.7.gz
    reading /var/log/dovecot.log.8.gz
    reading /var/log/dovecot.log.9.gz
    reading /var/log/dovecot.log.10.gz
    reading /var/log/dovecot.log.11.gz
    reading /var/log/dovecot.log.12.gz
    reading /var/log/dovecot.log.13.gz
    reading /var/log/dovecot.log.14.gz
    reading /var/log/dovecot.log.15.gz
    reading /var/log/dovecot.log.16.gz
    reading /var/log/dovecot.log.17.gz
    reading /var/log/dovecot.log.18.gz
    reading /var/log/dovecot.log.19.gz
    reading /var/log/dovecot.log.20.gz
    reading /var/log/dovecot.log.21.gz
    reading /var/log/dovecot.log.22.gz
    reading /var/log/dovecot.log.23.gz
    reading /var/log/dovecot.log.24.gz
    reading /var/log/dovecot.log.25.gz
    reading /var/log/dovecot.log.26.gz
    reading /var/log/dovecot.log.27.gz
    reading /var/log/dovecot.log.28.gz
    reading /var/log/dovecot.log.29.gz
    reading /var/log/dovecot.log.30.gz
    $

  5. #5
    Membre expérimenté
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Par défaut
    Ok, donc d'après ce que m'a expliqué geirha et Soliton sur #bash,
    ce sont les process qui essayent d'écrire du côté gauche du pipe qui reçoivent un SIGPIPE et meurent.
    Dans mon cas, ce qui recevait un SIGPIPE est donc le tail -1.
    La boucle for, elle, continue.

    La solution proposée est de sortir de la boucle dès que le premier tail reçoit un SIGPIPE,
    donc de réécrire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    command ls -1t /var/log/dovecot.log* | while read -r filename; do
            zgrep -H --line-buffered --color -E "login.*$1" "$filename" | tail -1 || break;
    done | head -1

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    Par défaut
    ON N'UTILISE PAS ls DANS UN SCRIPT !!!

    voici un exemple de traitement sur /var/log/alternatives que tu adapteras à tes besoins :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ find /var/log -maxdepth 1 -type f -name 'alternatives*' -print0 | sort -Vz | xargs -0 zgrep -l .
    /var/log/alternatives.log.1
    /var/log/alternatives.log.2.gz
    /var/log/alternatives.log.3.gz
    /var/log/alternatives.log.4.gz
    /var/log/alternatives.log.5.gz
    /var/log/alternatives.log.6.gz
    /var/log/alternatives.log.7.gz
    /var/log/alternatives.log.8.gz
    /var/log/alternatives.log.9.gz
    /var/log/alternatives.log.10.gz
    /var/log/alternatives.log.11.gz
    /var/log/alternatives.log.12.gz
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    Par défaut
    mais, une petite question, en (re)passant :
    journalctl -ru dovecot -g 'Login: user=<a\.chaouche' -n1 n'afficherait-il pas les informations que tu cherches ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre expérimenté
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Par défaut
    Mon journalctl ne dispose pas d'une option -g

  9. #9
    Membre expérimenté
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Par défaut
    Apriori journalctl donne uniquement des infos sur l'état du daemon lui même,
    c'est à dire la gestion du daemon à proprement parler
    (start, stop, restart, reload...)
    mais pas ce que le daemon log ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    root@messagerie-principale[10.10.10.19] ~ # journalctl -ru dovecot
    -- Logs begin at Tue 2022-10-04 15:56:07 CET, end at Tue 2022-10-11 15:45:01 CET. --
    Oct 09 18:07:48 messagerie systemd[1]: Started Dovecot IMAP/POP3 email server.
    Oct 09 18:07:48 messagerie systemd[1]: Starting Dovecot IMAP/POP3 email server...
    Oct 09 18:07:48 messagerie systemd[1]: Stopping Dovecot IMAP/POP3 email server...
    Oct 09 18:01:14 messagerie systemd[1]: Started Dovecot IMAP/POP3 email server.
    Oct 09 18:01:14 messagerie systemd[1]: Starting Dovecot IMAP/POP3 email server...
    Oct 09 18:01:14 messagerie systemd[1]: Stopping Dovecot IMAP/POP3 email server...
    root@messagerie-principale[10.10.10.19] ~ #

  10. #10
    Membre expérimenté
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Par défaut
    A moins qu'il ne s'occupe que de ce qui est mis dans des journaux bien spécifiques
    tels que [r]syslog
    mais dovecot n'écrit pas dedans
    il écrit dans son propre fichier de log
    /var/log/dovecot.log

    D'autre part, est-ce que journalctl va chercher dans les anciens journaux compressés ?

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    Par défaut
    c'est ce dont je suis en train de m'apercevoir aussi.
    dommage.

    n'empêche que
    Citation Envoyé par NBaH
    ON N'UTILISE PAS ls DANS UN SCRIPT !!!
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Membre expérimenté
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Par défaut
    Salut N_BaH,

    Raconte-moi la dernière fois où tu as eu des soucis en essayant de parser la sortie de ls.
    Je pense que ça pourra m'éclairer.
    Ou bien si tu as des liens intéressants avec des exemples concrets.

  13. #13
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    Par défaut
    c'était il y a looooooongtemps....
    j'ai voulu traiter un fichier nommé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mon
    -- fait --
    chier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ > 'mon
    -- fait --
    chier'
    $ ls mon*
    'mon'$'\n''-- fait --'$'\n''chier'
    tente ta chance.
    « y en a qu'ont essayé, ils ont eu des problèmes. »

    ce n'est pas parce que ce n'est pas fréquent qu'il faut considérer qu'utiliser ls est une bonne pratique.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    Membre expérimenté
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 304
    Par défaut
    Effectivement, en 20 ans d'informatique je n'ai pas encore trouvé un fichier nommé ainsi.
    Mais ça ne veut pas dire qu'ils n'existent pas.
    Je n'en ai juste jamais croisé dans ma vie.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment retirer cette ligne blanche (espace vide) ?
    Par apnw7931 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 05/01/2017, 09h34
  2. comment avoir cette ligne ds l'entete
    Par magdagmag dans le forum Mise en forme
    Réponses: 0
    Dernier message: 03/11/2012, 17h44
  3. Comment lire cette ligne ?
    Par Mister Paul dans le forum Langage
    Réponses: 2
    Dernier message: 21/08/2010, 15h47
  4. [MySQL] Comment adapter cette ligne en PHP
    Par l_nico dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/03/2010, 14h54
  5. Comment passer cette ligne
    Par Atchoum_002 dans le forum Langage
    Réponses: 3
    Dernier message: 06/10/2005, 15h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo