0

sedを使用して大量のSQLクエリログを解析しようとしており、各クエリで結合されているすべてのテーブルの名前を抽出したいと考えています。これが私が試していることです:

echo '[SQL_STMT="SELECT A FROM TABLEA JOIN TABLEB ON SOMETHING JOIN TABLEC ON SOMETHINGELSE WHERE A = 1"]' \
| sed -e 's/SQL_STMT=.*JOIN \([A-Z0-9_]*\) .*\]$/SQL_JOINS="\1"]/g'

ただし、これは次の値のみを返します。

[SQL_JOINS="TABLEC"]

私が見たいのは次のようなものです:

[SQL_JOINS="TABLEB TABLEC"]

任意の数の結合で機能します

では、結合されたすべてのテーブルを取得するように後方参照を構造化するにはどうすればよいですか?

4

1 に答える 1

0

perlソリューションに問題がない場合は、次のことを試してください。

$ echo "......" | perl -ne '@x=/JOIN (\w+)/g;print "[SQL_JOINS=\""."@x"."\"]";'

上記でのテストについて:

$ echo "[SQL_STMT=\"SELECT A FROM TABLEA JOIN TABLEB ON SOMETHING JOIN TABLEC ON SOMETHINGELSE WHERE A = 1\"]" | perl -ne '@x=/JOIN (\w+)/g;print "[SQL_JOINS=\""."@x"."\"]";'
[SQL_JOINS="TABLEB TABLEC"]

sedソリューション:

echo ...|sed -n ':a;/JOIN/{s/[^J]*JOIN \([A-Z0-9_]*\)/\1\n/;P;D;ta}' | sed -e ':a;N;s/\n/ /;ta' | sed  's/.*/[SQL_JOINS=\"&\"]/'

最初のsedはすべてのテーブル名を出力し、2番目のsedはテーブル名のすべての行を1つに結合し、最後のsedは必要な形式になるようにフォーマットします。

于 2012-10-26T15:13:59.490 に答える