模式匹配时获取xml的起始标记

时间:2016-01-13 07:25:39

标签: regex xml bash perl awk

在匹配模式时需要帮助来提取xml代码的开始到结束标记。 例如,我在我的xml文件中有这个:

global

在此示例中,我的模式将是客户端IP - 10.10.11.201。 我在多个xml文件中查找某些IP并且标签不统一,有些线路比其他线路更多 - 因此,我不能将“grep”与-B或-A一起使用,因此,基础应该是开始标记 <entry> <log_time>20150618-00:06:30</log_time> <description><![CDATA[Connection established]]></description> <service>SSH</service> <sessionid>02881141</sessionid> <type>0</type> <severity>0</severity> <lstnconnaddr>10.10.10.100:22</lstnconnaddr> <cliconnaddr>10.10.11.201:63530</cliconnaddr> <sguid>04AD6AD5-FB2E-4F03-7993-447648CC3EED</sguid> </entry> <entry> <log_time>20150618-00:06:30</log_time> <description><![CDATA[Sent server version: SSH-2.0-0]]></description> <service>SSH</service> <sessionid>08878297</sessionid> <type>0</type> <severity>1</severity> <lstnconnaddr>10.10.10.100:22</lstnconnaddr> <cliconnaddr>10.10.11.201:63529</cliconnaddr> <sguid>04AD6AD5-FB2E-4F03-7993-447648CC3EED</sguid> </entry> <entry> <log_time>20150616-00:00:00</log_time> <description><![CDATA[SSH Transport agreed algorithms Key exchange algorithm: diffie-hellman-group14-sha1 Server host key algorithm: ssh-rsa Client encryption algorithm: aes256-ctr Client MAC algorithm: hmac-sha1 Client compression algorithm: none Client language: Server encryption algorithm: aes256-ctr Server MAC algorithm: hmac-sha1 Server compression algorithm: none Server language: ]]></description> <service>SSH</service> <sessionid>48018549</sessionid> <type>0</type> <severity>1</severity> <lstnconnaddr>10.10.10.100:22</lstnconnaddr> <cliconnaddr>10.10.11.201:60580</cliconnaddr> <sguid>04AD6AD5-FB2E-4F03-7993-447648CC3EED</sguid> </entry> 以结束标记<>以获取该IP的整个事务。

让我试着更好地把我正在寻找的东西。例如,我正在寻找10.10.11.201的行:

</>

找到后,我需要整个开始结束标记:

<cliconnaddr>10.10.11.201:63529</cliconnaddr>

最好使用bash,awk,sed,perl。

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用XML::Twig来执行此操作。基本上,这将创建一个将为每个for()元素调用的处理程序,抓取父级并打印它。

$query  =   "SELECT pro_id, pro_page from tbl_checkout";
$result =   mysqli_query($c,$query)or die(mysqli_error($c));
$length =   mysqli_num_rows($result);
while($row  =   mysqli_fetch_array($result1))
{
    $pro_id[] = $row["pro_id"];
    $pro_page[] = $row['pro_page'];
}

for($i=0; $i<$length1; $i++)
{
    // don't assign to $pro_id and $pro_page as variable name: it will mess up your data!
    $tmp_id = explode(",", $pro_id[$i]);
    $tmp_page = explode(",", $pro_page[$i]);

    for($c=0; $c < count($tmp_id)) {
        echo $tmp_id[$c];
        echo $tmp_page[$c];
    }
}

答案 1 :(得分:0)

如果我做得对,您要做的是:按<entry>的值过滤您的<cliconnaddr>元素列表。对我来说,这有点像XSLT!

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:h="http://www.w3.org/1999/xhtml">
    <xsl:output encoding="UTF-8" method="xml" version="1.0" indent="yes"/>
    <!-- Catch-all templates -->
    <xsl:template match="@*|text()">
        <xsl:copy-of select="."/>
    </xsl:template>
    <xsl:template match="*">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="/">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:template>
    <xsl:template match="processing-instruction()">
        <xsl:copy/>
    </xsl:template>
    <!-- specific part -->
    <xsl:template match="entry[cliconnaddr[text()!='10.10.11.201:63529']]"/>
</xsl:stylesheet>

这个XSLT的作用是:复制除<cliconnaddr>没有值为“10.10.11.201:63529”的条目以外的所有内容。由于这是一个XSLT 1.0,因此很容易找到在您的上下文中运行的XSLT处理器。