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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 663
    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 663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 663
    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.

+ 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