Script shell pour extraire des balises xml

Bonjour,

svvp,je voulais programmer script shell sous unix qui permet de calculer la durée moyenne d'inter-arrivé des requètes sip.

Durée moyenne = ? (Temps_arrivé -req - Temps_arrivé_req-1 ) / (Nombre total des requêtes).
pour cela à partir d'un fichier xml (test.xml) capturé à 'aide de la commande tshark,je voulaisà l'aide d'un scrip unix :
1) extraire les champs temps d'arrivé ( section.Time)et requète correspondante(section.info).
2) calculer la durée d'inter-arrivée entre deux requètes sip.

le fichier test.xml est le suivant:
<?xml version="1.0"?>
<psml version="0" creator="wireshark/1.8.2">
<structure>
<section>No.</section>
<section>Time</section>
<section>Source</section>
<section>Destination</section>
<section>Protocol</section>
<section>Length</section>
<section>Info</section>
</structure>

<packet>
<section>9</section>
<section>27.127176000</section>
<section>192.168.245.1</section>
<section>192.168.245.142</section>
<section>SIP/SDP</section>
<section>949</section>
<section>Request: INVITE sip:6002@192.168.245.142, with session description</section>
</packet>

<packet>
<section>12</section>
<section>27.159294000</section>
<section>192.168.245.142</section>
<section>192.168.245.1</section>
<section>SIP</section>
<section>606</section>
<section>Status: 401 Unauthorized</section>
</packet>

<packet>
<section>13</section>
<section>27.160358000</section>
<section>192.168.245.1</section>
<section>192.168.245.142</section>
<section>SIP</section>
<section>370</section>
<section>Request: ACK sip:6002@192.168.245.142</section>
</packet>

.......
</psml>

svvvvvvvvvvvp c'est trés urgent........:)
merci d'avance

4 réponses

  • Votes
  • Date
  • Date décroissante
Résumé de la discussion

Calculer la durée moyenne d'inter-arrivée des requêtes SIP à partir d'un fichier XML capturé via tshark, en extrayant le temps d'arrivée et la requête associée pour chaque paquet. Plusieurs intervenants proposent d'identifier les dates et heures dans l'ordre, de calculer les écarts entre deux requêtes SIP consécutives et de diviser la somme des écarts par le nombre total de requêtes. La discussion aborde également les données à prendre en compte et le choix entre INVITE, ACK et CANCEL ou l'ensemble des messages SIP, avec des exemples et un extrait test2.txt illustrant le format des timestamps.

Bobot (l’IA à votre service)
  1. Contributeur
    Salut,

    svvvvvvvvvvvp c'est trés urgent........:)

    En cas d'urgence absolue, un seul réflexe : 3615 SOS !

    Le reste n'est que broutille superfétatoire ;-\

    Traduction : Ce site n'est pas tenu par des robots ou des professionnels mais par des bénévoles. Ces derniers répondent dans la limite de leurs compétence et du temps qu'ils peuvent consacrer à vos problèmes. Pour les urgences, s'adresser à des professionnels.
    1. Bon j m'excuse infinément je sais que ce n'est pas facile ce que je demande :) j'espère que je recevais des réponses qui résoud mon prob parceque vraiment chui plantée :(
      1. Contributeur
        Montres-nous ce que tu as commencé à faire...
    2. salut,

      pourquoi se contraindre à parser du xml?
      tshark peut sortir les données au format txt (peut-être plus pratique).
      1. En plus, il est bizarre ce XML, non ?
      2. en fait avec tshark j'ai exporté la trace sous 2 formes:pdml et psml
        trace psml:
        ?xml version="1.0"?>
        <psml version="0" creator="wireshark/1.8.2">
        <structure>
        <section>No.</section>
        <section>Time</section>
        <section>Source</section>
        <section>Destination</section>
        <section>Protocol</section>
        <section>Length</section>
        <section>Info</section>
        </structure>

        <packet>
        <section>9</section>
        <section>27.127176000</section>
        <section>192.168.245.1</section>
        <section>192.168.245.142</section>
        <section>SIP/SDP</section>
        <section>949</section>
        <section>Request: INVITE sip:6002@192.168.245.142, with session description</section>
        </packet>

        trace pdml:
        <?xml version="1.0"?>
        <?xml-stylesheet type="text/xsl" href="pdml2html.xsl"?>
        <!-- You can find pdml2html.xsl in /usr/share/wireshark or at http://anonsvn.wireshark.org/trunk/wireshark/pdml2html.xsl. -->
        <pdml version="0" creator="wireshark/1.8.2" time="Fri Aug 23 21:41:11 2013" capture_file="/home/serveur4/Desktop/xml-packet-wireshark/cap-okk">
        <packet>
        <proto name="geninfo" pos="0" showname="General information" size="709">
        <field name="num" pos="0" show="1" showname="Number" value="1" size="709"/>
        <field name="len" pos="0" show="709" showname="Frame Length" value="2c5" size="709"/>
        <field name="caplen" pos="0" show="709" showname="Captured Length" value="2c5" size="709"/>
        <field name="timestamp" pos="0" show="Aug 23, 2013 21:37:00.335476000 CEST" showname="Captured Time" value="1377286620.335476000" size="709"/>
        </proto>
        ................................................
        </proto>
        <proto name="sip" showname="Session Initiation Protocol" size="667" pos="42">
        <field name="sip.Request-Line" showname="Request-Line: SUBSCRIBE sip:asterisk@192.168.245.142:5060 SIP/2.0" size="51" pos="42" show="SUBSCRIBE sip:asterisk@192.168.245.142:5060 SIP/2.0" value="530">
        <field name="sip.Method" showname="Method: SUBSCRIBE" size="9" pos="42" show="SUBSCRIBE" value="535542534352494245"/>
        <field name="sip.r-uri" showname="Request-URI: sip:asterisk@192.168.245.142:5060" size="33" pos="52" show="sip:asterisk@192.168.245.142:5060" value="7369703a617374657269736b403139322e3136382e3234352e3134323a35303630">
        <field name="sip.r-uri.user" showname="Request-URI User Part: asterisk" size="8" pos="56" show="asterisk" value="617374657269736b"/>
        <field name="sip.r-uri.host" showname="Request-URI Host Part: 192.168.245.142" size="15" pos="65" show="192.168.245.142" value="3139322e3136382e3234352e313432"/>
        <field name="sip.r-uri.port" showname="Request-URI Host Port: 5060" size="4" pos="81" show="5060" value="35303630"/>
        </field>
        ........................................
        </proto>

        avec tshark j'ai pu extraite le temps et le type de requète :
        tshark -eth0 -T fiels -e frame.time et sip.Request-Line -z sip,stat > test2.txt
        j'au le fichier test2.txt suivant :

        Aug 27, 2013 23:06:46.205544000
        Aug 27, 2013 23:06:47.334270000 INVITE
        Aug 27, 2013 23:06:47.335045000 SIP/2.0 401 Unauthorized
        Aug 27, 2013 23:06:47.336897000 ACK
        Aug 27, 2013 23:06:47.350187000 INVITE
        Aug 27, 2013 23:06:47.351728000 SIP/2.0 100 Trying
        Aug 27, 2013 23:06:47.354311000 INVITE
        Aug 27, 2013 23:06:47.500954000 SIP/2.0 180 Ringing
        Aug 27, 2013 23:06:47.504776000 SIP/2.0 180 Ringing
        Aug 27, 2013 23:06:48.415368000 CANCEL
        Aug 27, 2013 23:06:48.416001000 SIP/2.0 487 Request Terminated
        Aug 27, 2013 23:06:48.416193000 SIP/2.0 200 OK
        Aug 27, 2013 23:06:48.416522000 CANCEL
        Aug 27, 2013 23:06:48.424779000 ACK
        Aug 27, 2013 23:06:48.590352000 SIP/2.0 200 OK
        Aug 27, 2013 23:06:48.590370000 SIP/2.0 487 Request Terminated
        Aug 27, 2013 23:06:48.595704000 ACK

        ===================================================================
        SIP Statistics

        Number of SIP messages: 16
        Number of resent SIP messages: 0

        * SIP Status Codes in reply packets
        SIP 401 Unauthorized : 1 Packets
        SIP 180 Ringing : 2 Packets
        SIP 200 OK : 2 Packets
        SIP 487 Request Terminated : 2 Packets
        SIP 100 Trying : 1 Packets

        * List of SIP Request methods
        INVITE : 3 Packets
        ACK : 3 Packets
        CANCEL : 2 Packets

        * Average setup time 593364750 ms
        Min 2 ms
        Max 1802658152 ms
      3. Donc mo prob maintenant est de calculer à l'aide d'un script le temps d'interarrivé des requetes succésives ( invite,ack,cancel) :
      4. calculer à l'aide d'un script le temps d'interarrivé des requetes succésives

        quel serait la sortie (le résultat) après traitement à partir de l'échantillon que tu donnes en exemple ?
      5. la sortie serais une valeur (réelle) ,l'obectif final est calculer la durée moyenne:
        donc iil faut commencer à calculer la durée d'inter-arrivée des requètes sucessives ,deux par deux c àd la durée entre chaque requète en cours et celle qui la précède ( Temps_arrivé -req - Temps_arrivé_req-1 ) et ensuite on :
        Durée moyenne = ? (Temps_arrivé -req - Temps_arrivé_req-1 ) / (Nombre total des requêtes).
    3. Bonjour,
      J'ai fais un script qui répond à votre première demande, vous le trouverez ici :

      http://mathieu.coavoux.free.fr/index.php?title=Commande#Exemple_sed_et_awk
      1. Contributeur
        Salut,

        Merci pour lui, mais il eut été plus simple de copier/coller le code ici plutôt que de poster un lien (non cliquable qui plus est du fait que vous n'êtes pas inscrit), qui rend la compréhension difficile du fait qu'il ne soit pas direct sur le script ;-(
      2. désolé, je viens de m'inscrire.

        je me suis dis que le code serait plus lisible sur le wiki et les caractères ne risque pas d'être changés
      3. Contributeur
        #!/bin/bash
        MONFICHIER=test.xml
        TOTALLIGNE='cat $MONFICHIER|wc -l'
        LIGNEHEADER=11
        LIGNEALIRE='expr $TOTALLIGNE - $LIGNEHEADER' #Soustrait les lignes d en-tete et le nombre de ligne pour garder les donnees
        tail -n $LIGNEALIRE $MONFICHIER |tr '\n' ';'|awk '{gsub(/<.?packet> ;/,"\n");print $0}'|awk 'FS=";" {print $2"\n"$7}'|sed -e 's/<section>//' -e 's/<\/section>//' -e '/^ *$/d'
      4. Sinon bienvenue mctroubleshooter, en plus c'est cool, j'ai cru comprendre que tu utilisais Gentoo ?
      5. merci.
        oui j'ai pas mal utilisé gentoo, maintenant je fais un peu toutes les distribs