1

以下のようなファイルがあります

  <AUDIT_RECORD TIMESTAMP="2013-07-30T17:52:29" NAME="Query" CONNECTION_ID="10" STATUS="0" SQLTEXT="show databases"/>
  <AUDIT_RECORD TIMESTAMP="2013-07-29T17:27:53" NAME="Quit" CONNECTION_ID="12" STATUS="0"/>
  <AUDIT_RECORD TIMESTAMP="2013-07-30T17:52:29" NAME="Query" CONNECTION_ID="10" STATUS="0" SQLTEXT="show grants for root@localhost"/>
  <AUDIT_RECORD TIMESTAMP="2013-07-30T17:52:29" NAME="Query" CONNECTION_ID="10" STATUS="0" SQLTEXT="create table stamp like paper"/>

ここで、各レコードはで始まり、<AUDIT_RECORDで終わり"/>、レコードは複数の行にまたがる場合があります。

私の要件は、以下のような結果を表示することです

  <AUDIT_RECORD TIMESTAMP="2013-07-30T17:52:29" NAME="Query" CONNECTION_ID="10" STATUS="0" SQLTEXT="show databases"/>
  <AUDIT_RECORD TIMESTAMP="2013-07-30T17:52:29" NAME="Query" CONNECTION_ID="10" STATUS="0" SQLTEXT="show grants for root@localhost"/>
  <AUDIT_RECORD TIMESTAMP="2013-07-30T17:52:29" NAME="Query" CONNECTION_ID="10" STATUS="0" SQLTEXT="create table stamp like paper"/>

その目的のために私は使用しました

sed -n "/Query/,/\/>/p" file.txt

しかし、文字列「Quit」のレコードを含むファイル全体が表示されています。

誰でもこれに関して私を助けることができますか? また、「Query」という名前の文字列 ( など) を正確に一致させることができるかどうかも教えてくださいgrep -w "Query"

4

4 に答える 4

3

XMLパーサーが適切なツールであるという@chorobaに同意します。ただし、利用可能なものがない場合は、次の awk スクリプトを試すことができます。

awk '/Query/{print RS" "$0}' RS='<AUDIT_RECORD' file
于 2013-08-15T13:46:27.097 に答える
2

私の提案したsedソリューション:

sed 's/<[^>]*\"Quit\"[^>]*>//' file.txt

複数行にまたがるレコードの場合は、次を試してください。

sed '{:q;N;s/\n/ /g;t q}' file.txt | sed 's/<[^>]*\"Quit\"[^>]*>//'

改行 RS を追加:

... | sed 's|/>|/>\n|g'
于 2013-08-15T13:55:40.050 に答える
2

入力はおそらく XML です。特にレコードが複数行にまたがる場合は、適切なパーサーを使用して処理してください。たとえば、xsh :

open file.xml ;
remove //AUDIT_RECORD[not(@NAME="Query")] ;
save :b ;
于 2013-08-15T13:42:16.480 に答える