Извлеките пару значений в xml записи прокси Чарльза, используя bash - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть xml прокси-запись Чарльза, из которой я пытаюсь найти и извлечь пару значений с помощью XPath, но не совсем уверен, что извлеку их без жесткого кодирования xpath. Ниже приведено xml одной транзакции

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE charles-session SYSTEM "https://www.charlesproxy.com/dtd/charles-session-1_2.dtd">

<charles-session>
<transaction status="COMPLETE" method="POST" protocolVersion="HTTP/1.1" protocol="https" host="awcmex.ssdevrd.com" actualPort="443" path="/awcm" remoteAddress="aw.ss.com/12.70.19.19" clientAddress="/127.0.0.1" clientPort="50581" startTime="2020-02-09T12:01:23.043+05:30" startTimeMillis="1581229883043" requestBeginTime="2020-02-09T12:01:26.417+05:30" requestBeginTimeMillis="1581229886417" requestTime="2020-02-09T12:01:26.422+05:30" requestTimeMillis="1581229886422" responseTime="2020-02-09T12:02:59.516+05:30" responseTimeMillis="1581229979516" endTime="2020-02-09T12:02:59.517+05:30" endTimeMillis="1581229979517" duration="96084" dnsDuration="30" connectDuration="704" sslDuration="2250" requestDuration="5" responseDuration="1" latency="93094" overallSpeed="251" requestSpeed="376600" responseSpeed="22323000" totalSize="24206">
<ssl protocol="TLSv1.2" cipherSuite="TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384" />
<request handshake="1334" headers="324" body="225" mime-type="application/json">
<headers>
<first-line><![CDATA[POST /awcm HTTP/1.1]]></first-line>
<header>
<name>Host</name>
<value>aw.ss.com:443</value></header>
<header>
<name>Content-Type</name>
<value>application/json</value></header>
<header>
<name>User-Agent</name>
<value>awc/1.0.0 CFNetwork/978.2 Darwin/18.7.0 (x86_64)</value></header>
<header>
<name>Connection</name>
<value>keep-alive</value></header>
<header>
<name>Accept</name>
<value>*/*</value></header>
<header>
<name>Accept-Language</name>
<value>en-us</value></header>
<header>
<name>Content-Length</name>
<value>225</value></header>
<header>
<name>Accept-Encoding</name>
<value>br, gzip, deflate</value></header>
<header>
<name>awsession</name>
<value>8594797088EBFD8EC21948508AC910F6F06FB2DF</value></header></headers>
<body><![CDATA[{
  "messageid" : "WSzJUUoYsr9YcP2mYuVP",
  "destinationuuid" : "",
  "durable" : "true",
  "priority" : "0",
  "life" : "0",
  "originapplicationid" : "",
  "originuuid" : "9AEC3865782F5849B21B34C0516F515E",
  "type" : "1"
}]]></body></request>
<response status="200" handshake="22308" headers="0" body="15" mime-type="text/plain" charset="UTF-8">
<headers>
<first-line><![CDATA[HTTP/1.1 200 OK]]></first-line>
<header>
<name>Content-Type</name>
<value>text/plain; charset=UTF-8</value></header>
<header>
<name>Content-Length</name>
<value>15</value></header>
<header>
<name>aw-host</name>
<value>AWC201 [ AWC201.AWSS.DEV ]</value></header>
<header>
<name>Connection</name>
<value>keep-alive</value></header></headers>
<body><![CDATA[{"messages":[]}]]></body></response></transaction></charles-session>

В основном я хочу проанализировать и получить количество транзакций в сеансе, User-Agent в каждой транзакции и его значение. Я попытался PROCESS1 = $ (строка xmllint --xpath '(/ сеанс charles / транзакция [1] / запрос / заголовки / заголовок [1])' $ XML_FILE) Но я не могу получить два в каждой транзакции без жесткого заголовка []. Есть предложения?

1 Ответ

0 голосов
/ 11 февраля 2020

Вы можете использовать это для группировки и подсчета заголовков пользовательских агентов:

  xmllint --xpath '//request/headers/header[name/text()[contains(.,"User-Agent")]]/value/text()' sample.txt | sort | uniq -c

Результат будет примерно таким:

  5 awc/1.0.0 CFNetwork/978.2 Darwin/18.7.0 (x86_64)

Примечание: вам нужна довольно свежая версия из xmllint. Существует проблема с xmllint, старые версии не добавляют новые строки в выход каждого узла - см. Как добавить новую строку после каждого соответствия, используя xmlint --xpath для возможного решения.

...