1

複数の文字列出力から xml データを動的に (データが変化して) 列形式に抽出しようとしています。

SQL データベースに対してクエリを実行すると、これらの XML ビットのうち約 100 個がエコーアウトされます。

<?xml version="1.0"?>
<Connection>
  <ConnectionType>Putty</ConnectionType>
  <CreatedBy>Someone</CreatedBy>
  <CreationDateTime>2014-10-27T11:53:59.8993492-04:00</CreationDateTime>
  <Events>
    <OpenCommentPrompt>true</OpenCommentPrompt>
    <WarnIfAlreadyOpened>true</WarnIfAlreadyOpened>
  </Events>
  <Group>Cloud Services Client Delivery\Willis\Linux\Test - SJC</Group>
  <ID>77e96d52-f165-482f-8389-ffb95b9d8ccd</ID>
  <KeyboardHook>InFullScreenMode</KeyboardHook>
  <MetaInformation />
  <Name>Hostname-H-A10D</Name>
  <OpenEmbedded>true</OpenEmbedded>
  <PinEmbeddedMode>False</PinEmbeddedMode>
  <Putty>
    <PortFowardingArray />
    <Scripting />
    <SessionHost>10.0.0.100</SessionHost>
    <SessionName>10.0.0.100</SessionName>
    <TelnetEncoding>IBM437</TelnetEncoding>
  </Putty>
  <ScreenColor>C24Bits</ScreenColor>
  <SoundHook>DoNotPlay</SoundHook>
  <Stamp>771324d1-0c59-4f12-b81e-96edb5185ef7</Stamp>
</Connection>

そして、必要なのは列形式の and です。そして、本質的にホスト名が Hostname-H-A10D と等しい場合、最後の D を一致させ、最初の列を Dev、Q を Test としてマークし、最後に Prod として文字を付けないようにしたいと考えています。したがって、出力は次のようになります -->

Dev Hostname-H-A10D 10.0.0.100
Dev Hostname-H-A11D 10.0.0.101
Prod Hostname-H-A12 10.0.0.201
Test Hostname-H-A13Q 10.0.0.10

私は sed/awk/etc をいじってみましたが、一時的なフラット ファイルを書き出さないと、必要な形式を取得できないだけではありません。xmlstarlet や xmllint などを使用して、これを配列に入れることをお勧めします。もちろん、より良い提案を行うことができます。それが私がここにいる理由です:) ありがとうございます。

4

2 に答える 2

3

XML パーサーを使用することをお勧めします。

使用awk:

$ awk -F'[<>]' 'BEGIN{a["D"]="Dev";a["Q"]="Test"} /Name/{name=$3; type=a[substr(name,length(name))]; if (length(type)==0) type="Prod";} /SessionHost/{print type, name, $3;}' s.xml
Dev Hostname-H-A10D 10.0.0.100

使い方

  • BEGIN{a["D"]="Dev";a["Q"]="Test"}

    これは連想配列を定義しますa

  • /Name/{name=$3; type=a[substr(name,length(name))]; if (length(type)==0) type="Prod";}

    ホスト名を含む行で、これはホスト名をキャプチャし、そこからホスト タイプを決定します。

  • /SessionHost/{print type, name, $3;}

    ホスト IP を含む行に、タイプ、名前、および IP が表示されます。

于 2014-11-01T05:15:38.600 に答える
0

ホストがDev、Prod、またはTestのいずれであっても、XMLファイルにパラメーターについて言及していません。

ただし、上記の XML ファイルから、次の方法で名前を取得できます。

$cat test.xml |grep Name |awk -F '[<,>]'  '{print $3}' |xargs
Hostname-H-A10D 10.0.0.100
于 2014-11-01T05:12:42.783 に答える