使用AWK检索特定XML标记之间的文本

时间:2015-02-06 11:03:14

标签: xml linux parsing ubuntu awk

这是我的问题:我有一个太重的xml文件(60 MB)所以我想在特定标签之间检索文本。

我的xml是这样的:所以我会检索PrimaryCategory中的标签,其中PrimaryCategoryID = 3

<PrimaryCategory>
    <PrimaryCategoryID>3</PrimaryCategoryID>
    <PrimaryCategoryName>Billets de concert</PrimaryCategoryName>
    <PrimaryCategoryURL>http://www.viagogo.fr/Billets-de-concert</PrimaryCategoryURL>
    <CategoryList>
      <CategoryID>13632</CategoryID>
      <CategoryName>Ron Sexsmith</CategoryName>
      <CategoryURL>http://www.viagogo.fr/Billets-de-concert/Pop-Rock/Ron-Sexsmith-Billets</CategoryURL>
      <CategoryImageURL>http://cdn1.viagogo.net/img/cat/1207/2/1.jpg</CategoryImageURL>
      <CategoryDescription />
    </CategoryList>
    <CategoryList>
      <CategoryID>27605</CategoryID>
      <CategoryName>Theme Park</CategoryName>
      <CategoryURL>http://www.blalbalbla.com</CategoryURL>
      <CategoryImageURL>http://www.blalbalbla.com</CategoryImageURL>
      <CategoryDescription />
    </CategoryList>
    <CategoryList>
      <CategoryID>21935</CategoryID>
      <CategoryName>Idina Menzel</CategoryName>
      <CategoryURL>http://www.blalbalbla.com</CategoryURL>
      <CategoryImageURL>http://www.blalbalbla.com</CategoryImageURL>
      <CategoryDescription />
      <EventList>
        <EventID>740520</EventID>
        <EventName>Idina Menzel</EventName>
        <EventDate>2015-06-26T20:00:00</EventDate>
        <EventURL>http://www.blalbalbla.com</EventURL>
        <VenueID>175</VenueID>
        <VenueName>Bournemouth International Centre (BIC)</VenueName>
        <VenueAddress>Exeter Road</VenueAddress>
        <VenueCity>Bournemouth</VenueCity>
        <VenueState />
        <VenueCountryCode>GB</VenueCountryCode>
        <VenuePostCode>BH2 5BH</VenuePostCode>
        <MinCurrentPrice>90.4500</MinCurrentPrice>
        <MaxCurrentPrice>213.0700</MaxCurrentPrice>
        <AvailableTickets>14</AvailableTickets>
        <OnSaleDate>2014-12-03T18:24:00</OnSaleDate>
      </EventList>
<PrimaryCategory>
    <PrimaryCategoryID>2</PrimaryCategoryID>
    <PrimaryCategoryName>concert</PrimaryCategoryName>
    <PrimaryCategoryURL>http://www.blalbalbla.com</PrimaryCategoryURL>
    <CategoryList>
      <CategoryID>13632</CategoryID>
      <CategoryName>Ron Sexsmith</CategoryName>
      <CategoryURL>http://www.blalbalbla.com</CategoryURL>
      <CategoryImageURL>http://www.blalbalbla.com</CategoryImageURL>
      <CategoryDescription />
    </CategoryList>
    <CategoryList>
      <CategoryID>25605</CategoryID>
      <CategoryName>blablabal</CategoryName>
      <CategoryURL>http://www.blalbalbla.coms</CategoryURL>
      <CategoryImageURL>http://www.blalbalbla.com</CategoryImageURL>
      <CategoryDescription />
    </CategoryList>
    <CategoryList>
      <CategoryID>21935</CategoryID>
      <CategoryName>Idina Menzel</CategoryName>
      <CategoryURL>hhttp://www.blalbalbla.com</CategoryURL>
      <CategoryImageURL>http://www.blalbalbla.com</CategoryImageURL>
      <CategoryDescription />
      <EventList>
        <EventID>749820</EventID>
        <EventName>Idina Menzel</EventName>
        <EventDate>2015-06-26T20:00:00</EventDate>
        <EventURL>http://www.blalbalbla.com0</EventURL>
        <VenueID>175</VenueID>
        <VenueName>Bournemouth International Centre (BIC)</VenueName>
        <VenueAddress>Exeter Road</VenueAddress>
        <VenueCity>Bournemouth</VenueCity>
        <VenueState />
        <VenueCountryCode>GB</VenueCountryCode>
        <VenuePostCode>BH2 5BH</VenuePostCode>
        <MinCurrentPrice>90.4500</MinCurrentPrice>
        <MaxCurrentPrice>213.0700</MaxCurrentPrice>
        <AvailableTickets>14</AvailableTickets>
        <OnSaleDate>2014-12-03T18:24:00</OnSaleDate>
      </EventList>
    </CategoryList>
</PrimaryCategory>

所以我会检索PrimaryCategory中PrimaryCategoryID = 3

的标签

3 个答案:

答案 0 :(得分:2)

不要使用基于行的工具来处理XML,它将无法正常工作。没有人希望你的XML处理代码在移动空格,插入换行符或以不同顺序指定的标签时中断。

相反,请使用正确解析XML并使用XPath进行选择的工具。例如,使用xmllint

xmllint --xpath '//PrimaryCategory[PrimaryCategoryID=3]' filename.xml

xmlstarlet

xmlstarlet sel -t -c '//PrimaryCategory[PrimaryCategoryID=3]' filename.xml

请注意,这要求您的输入是有效的XML,而问题中的代码段不是(缺少结束标记)。我的工作是假设这是一个复制/粘贴错误。

答案 1 :(得分:0)

试试这个,它会从PrimaryCategoryID文件中检索xml元素的值,如下所示,

grep -oP '(?<=>).*?(?=</PrimaryCategoryID>)' data.xml

您的输出将是,

3

答案 2 :(得分:0)

gnu awk(由于记录选择器中的多个字符)应该:

awk -v RS="<PrimaryCategory>" '{split($1,a,"<|>")} a[3]==3 {print RT,$0}' file
<PrimaryCategory>
    <PrimaryCategoryID>3</PrimaryCategoryID>
    <PrimaryCategoryName>Billets de concert</PrimaryCategoryName>
    <PrimaryCategoryURL>http://www.viagogo.fr/Billets-de-concert</PrimaryCategoryURL>
    <CategoryList>
      <CategoryID>13632</CategoryID>
      <CategoryName>Ron Sexsmith</CategoryName>
      <CategoryURL>http://www.viagogo.fr/Billets-de-concert/Pop-Rock/Ron-Sexsmith-Billets</CategoryURL>
      <CategoryImageURL>http://cdn1.viagogo.net/img/cat/1207/2/1.jpg</CategoryImageURL>
      <CategoryDescription />
    </CategoryList>
    <CategoryList>
      <CategoryID>27605</CategoryID>
      <CategoryName>Theme Park</CategoryName>
      <CategoryURL>http://www.blalbalbla.com</CategoryURL>
      <CategoryImageURL>http://www.blalbalbla.com</CategoryImageURL>
      <CategoryDescription />
    </CategoryList>
    <CategoryList>
      <CategoryID>21935</CategoryID>
      <CategoryName>Idina Menzel</CategoryName>
      <CategoryURL>http://www.blalbalbla.com</CategoryURL>
      <CategoryImageURL>http://www.blalbalbla.com</CategoryImageURL>
      <CategoryDescription />
      <EventList>
        <EventID>740520</EventID>
        <EventName>Idina Menzel</EventName>
        <EventDate>2015-06-26T20:00:00</EventDate>
        <EventURL>http://www.blalbalbla.com</EventURL>
        <VenueID>175</VenueID>
        <VenueName>Bournemouth International Centre (BIC)</VenueName>
        <VenueAddress>Exeter Road</VenueAddress>
        <VenueCity>Bournemouth</VenueCity>
        <VenueState />
        <VenueCountryCode>GB</VenueCountryCode>
        <VenuePostCode>BH2 5BH</VenuePostCode>
        <MinCurrentPrice>90.4500</MinCurrentPrice>
        <MaxCurrentPrice>213.0700</MaxCurrentPrice>
        <AvailableTickets>14</AvailableTickets>
        <OnSaleDate>2014-12-03T18:24:00</OnSaleDate>
      </EventList>

它使用<PrimaryCategory>作为记录分隔符拆分文件 然后,如果字段1包含数字3,则打印分隔符和行的其余部分