Suppression ligne dans fichier si valeur superieur à ....

lsda26 -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
Voici un extrait de mon fichier à traiter:
--- 137.121.161.201 ping statistics ---  
11 packets transmitted, 11 received, 0% packet loss, time 10001ms  
rtt min/avg/max/mdev = 0.424/0.469/0.534/0.041 ms  
vendredi 26 avril 2013, 12:38:15 (UTC+0200)  
ping du switch 137.121.161.201 à partir de HP-73 port 20  
PING 137.121.161.201 (137.121.161.201) 56(84) bytes of data.  
64 bytes from 137.121.161.201: icmp_req=1 ttl=64 time=0.455 ms  
64 bytes from 137.121.161.201: icmp_req=2 ttl=64 time=0.470 ms  
64 bytes from 137.121.161.201: icmp_req=3 ttl=64 time=0.476 ms  
64 bytes from 137.121.161.201: icmp_req=4 ttl=64 time=0.562 ms  
64 bytes from 137.121.161.201: icmp_req=5 ttl=64 time=0.475 ms  
64 bytes from 137.121.161.201: icmp_req=6 ttl=64 time=27.8 ms  
64 bytes from 137.121.161.201: icmp_req=7 ttl=64 time=28.2 ms  
64 bytes from 137.121.161.201: icmp_req=8 ttl=64 time=94.2 ms  
64 bytes from 137.121.161.201: icmp_req=9 ttl=64 time=123 ms  
64 bytes from 137.121.161.201: icmp_req=10 ttl=64 time=112 ms  
64 bytes from 137.121.161.201: icmp_req=11 ttl=64 time=148 ms  

--- 137.121.161.201 ping statistics ---  
11 packets transmitted, 11 received, 0% packet loss, time 10004ms  
rtt min/avg/max/mdev = 0.455/48.829/148.134/55.706 ms  
vendredi 26 avril 2013, 12:38:26 (UTC+0200)  
ping du switch 137.121.161.201 à partir de HP-73 port 20  
PING 137.121.161.201 (137.121.161.201) 56(84) bytes of data.  
64 bytes from 137.121.161.201: icmp_req=1 ttl=64 time=153 ms  
64 bytes from 137.121.161.201: icmp_req=2 ttl=64 time=168 ms  
64 bytes from 137.121.161.201: icmp_req=3 ttl=64 time=220 ms  
64 bytes from 137.121.161.201: icmp_req=4 ttl=64 time=237 ms  
64 bytes from 137.121.161.201: icmp_req=5 ttl=64 time=163 ms  
64 bytes from 137.121.161.201: icmp_req=6 ttl=64 time=233 ms  
64 bytes from 137.121.161.201: icmp_req=7 ttl=64 time=235 ms  
64 bytes from 137.121.161.201: icmp_req=8 ttl=64 time=172 ms  
64 bytes from 137.121.161.201: icmp_req=9 ttl=64 time=230 ms  
64 bytes from 137.121.161.201: icmp_req=10 ttl=64 time=191 ms  
64 bytes from 137.121.161.201: icmp_req=11 ttl=64 time=194 ms


Je souhaite supprimer toute les lignes de ce fichier contenant la chaine "time=" et ayant une valeur qui suit inferieur à 20 (ms)

Merci
J'arrive à recupérer les valeurs en miliseconde avec:
cat $fichier | grep "time=" | cut -d "=" -f 2 | cut -d " " -f 1
mais je n'arrive pas à faire un test de cette valeur pour chaque ligne du fichier et de supprimer la ligne correspondante si le test et positif.

Merci pour votre aide!

4 réponses

  1. mamiemando Messages postés 33174 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Bonjour,

    Je pense que ce serait beaucoup plus simple avec awk ou un script shell. Sur le principe il te faut extraire la valeur avec une expression régulière et la tester. En fonction du résultat tu réécris ou non la ligne.

    Bonne chance
    0
  2. lsda26
     
    Je suis pas un pro de awk malheureusement.
    J'ai réussit à filtrer ce que je voulais avec 3 sed successif:
    sed -i '/time=[0-1][0-9]\.[0-9]\ ms$/d' $fichier
    sed -i '/time=0\.[0-9][0-9][0-9]\ ms$/d' $fichier
    sed -i '/time=[0-9].[0-9][0-9]\ ms$/d' $fichier

    Mais maintenant je me retrouve avec des paragraphes sans un seul ping.
    du type:
    --- 137.121.161.201 ping statistics ---
    11 packets transmitted, 11 received, 0% packet loss, time 10001ms
    rtt min/avg/max/mdev = 0.456/0.593/1.037/0.172 ms
    vendredi 26 avril 2013, 11:26:18 (UTC+0200)
    ping du switch 137.121.161.201 à partir de HP-73 port 20
    PING 137.121.161.201 (137.121.161.201) 56(84) bytes of data.
    
    --- 137.121.161.201 ping statistics ---
    11 packets transmitted, 11 received, 0% packet loss, time 9997ms
    rtt min/avg/max/mdev = 0.457/0.550/0.868/0.120 ms
    vendredi 26 avril 2013, 11:26:28 (UTC+0200)
    ping du switch 137.121.161.201 à partir de HP-73 port 20
    PING 137.121.161.201 (137.121.161.201) 56(84) bytes of data.


    donc je souhaite supprimer les 6 lignes précedante si après "PING 137.121.161.201 (137.121.161.201)" la ligne est "vide"
    0
  3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
     
    Salut,

    awk -F'[ =]' '$10 > 20 { print }' fichier

    0
    1. lsda26
       
      merci mais j'aimerai n'effacer les lignes
      --- 137.121.161.201 ping statistics ---
      11 packets transmitted, 11 received, 0% packet loss, time 9997ms
      rtt min/avg/max/mdev = 0.457/0.550/0.868/0.120 ms
      vendredi 26 avril 2013, 11:26:28 (UTC+0200)
      ping du switch 137.121.161.201 à partir de HP-73 port 20
      PING 137.121.161.201 (137.121.161.201) 56(84) bytes of data.


      seulement si il n'y a pas de ping supérieur à 20ms, donc supprimer ces ligne si il n'y a pas de ping après la ligne "PING 137.121.161.201 (137.121.161.201) 56(84) bytes of data."
      0
  4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    awk -F "[ =]+" '/time=/ && $(NF-1)<20.0 {next} {print}' fichier
    0
    1. lsda26
       
      Merci pour la commande awk!
      Par contre je retrouve comme à la suite de mes commandes sed, avec des paragraphes sans un seul ping. Donc quand un paragraphe n'a pas de ping j'aimerais le supprimer. Donc supprimer de la ligne "--- 137.121.161.201 ping statistics ---" à la ligne "PING 137.121.161.201 (137.121.161.201)" pour ne garder que des paragraphe avec des pings et ainsi ne garder que l'essentiel de mon fichier de sortie.
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      essayer ça
      awk -F "[ =]+" '/^---/ {h="\n" $0; n=1; next} $0 !~ /time=/ {h=h "\n" $0} /time=/ {if($(NF-1)>20.0){if(n){print h; n=0}; print}}' fichier
      
      0